我的数组代码有什么问题

时间:2014-08-22 10:15:28

标签: c++ arrays

我正在尝试生成一个可能与维度无关的数组。我试过这个

#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;
}

当我编译它时,我最终只有一个零数组,我无法找到我错在哪里。有人可以帮忙吗?

2 个答案:

答案 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 ++,这尤其适用。了解现代的做事方式,它将使您的生活更轻松,同时提高您的代码质量。