我正在尝试生成一个可能与维度无关的数组。我试过这个
#include <iostream>
using namespace std;
class array3d
{
public:
array3d(size_t* d, int dims)
{
int all = 1;
size_t* dimensions;
int* array;
for (size_t i = 0; i < dims; i++) {
all = d[i];
dimensions = new size_t[dims];
array = new int[all];
std::cout << array[i] << std::endl;
}
}
};
int main()
{
size_t d[6];
d[0] = 2;
d[1] = 3;
d[2] = 4;
d[3] = 2;
d[4] = 3;
d[5] = 4;
array3d arr(d, 6);
return 0;
}
当我编译它时,我最终只有一个零数组,我无法找到我错在哪里。有人可以帮忙吗?
答案 0 :(得分:0)
我无法理解你的代码背后的逻辑,但如果你只是想看到印刷的东西你可能意味着这样做:
array = new int [all];
//write something here first!
array[i] = some_value; <--- Note that this may access past the end of the array
std::cout << array[i] << std::endl;
或者更有可能你想要这个:
std::cout << d[i] << std::endl;
注1:你应该真的听0d0a并使用std::vector
,除非你真的需要数组
注意2:您正在签署一些未签名的比较(i < dims
) - 您可能也想照顾那些
答案 1 :(得分:0)
array = new int[all];
未初始化已分配的内存。它只会从堆中进行分配,但保留内存的内容(或者,实际上,严格来说,访问已分配但未初始化的内存可能是未定义的行为)。
你只是偶然看到零,因为内存恰好包含零。它可能是因为它尚未被您的程序分配,使用和发布,并且操作系统在将其提供给您的程序之前用零填充它。
此外,如果std::cout << array[i] << std::endl;
,i>=all
将是缓冲区溢出。为什么你这样做呢?
最后,你的代码会像疯了一样泄漏内存。你的循环循环dims
次,每次迭代你用new
进行两次分配,但是你丢失了返回的指针。
简而言之,在C ++中使用std::vector
,(几乎)从不使用普通的C数组。如果您有一个固定长度数组的明确用例,请使用std::array
。此外,大多数情况下,如果您在C ++应用程序代码中使用裸指针,则表明您没有做到这一点。使用智能指针。如果您今天正在学习C ++,这尤其适用。了解现代的做事方式,它将使您的生活更轻松,同时提高您的代码质量。