【问题标题】:Failed to allocate an array of pointers to a struct未能分配指向结构的指针数组
【发布时间】:2016-05-22 18:45:01
【问题描述】:

我正在尝试分配一个指向结构的指针数组,但我的代码有问题。

这是我的结构:

struct Brick {
  GameObject2D* handle_;
};

Brick** bricks_;

这就是我尝试为它分配内存的方式:

int bricks_amount_ = 10;    

bricks_ = (Brick**)malloc(sizeof(Brick*) * bricks_amount_);

程序崩溃。我已经在它上面做了一个 devenv 来调试问题出在哪里,它在这条线上崩溃了:

for (unsigned short int i = 0; i < bricks_amount_; i++){
  bricks_[i]->handle_ = new GameObject2D(); <---------- CRASH!
}

有什么建议吗?

PS:对不起我的英语:P

================================================ ============================

[解决方案]

最后我决定使用 std::vector 代替原始指针:

bricks_.resize(bricks_amount_);

但我已经尝试使 malloc 以不同的方式工作,并且它也可以工作:

bricks_ = (struct Brick*)malloc(sizeof(struct Brick) * bricks_amount_);

或者这个:

bricks_ = new Brick[bricks_amount_];

感谢愿意提供帮助的人!

【问题讨论】:

  • 显然bricks_[i]-&gt;handle_ 访问的是未初始化的内存。 bricks_[i] 没有被赋值。
  • 同样不要混合malloc()new(),使用new []分配数组。
  • 对@KerrekSB' 注释的附加说明 (+1):malloc 创建了一个可用数组,但内容未初始化,这意味着您的 Brick* 指针都是完全随机的值,可能为 null,可能指向超越星星...您错过的是game_state_.bricks_[i] = new Brick();,例如。 G。在你崩溃之前,初始化数组中的每个指针。
  • 为什么都是指针?为什么任何指针?
  • 如果你停止使用原始指针,生活会变得更简单

标签: c++ arrays pointers struct malloc


【解决方案1】:

它是 C++:

  • 不要使用malloc,使用new
  • 不要使用普通数组,使用std::vectorstd::array
  • 不要使用原始指针,使用std::unique_ptr

【讨论】:

  • 类似这样的东西:bricks_ = new Brick [bricks_amount_];
【解决方案2】:

不要使用

Bricks **   //will be a 2 dimensional array 

改为使用

Bricks *   //will be a 1 dimensioanal array

如果你想要一个单维数组

那就做吧

`Bricks * bricks_  = (Bricks *)malloc(sizeof(Brick) * bricks_amount_ );

`

那么你就可以安全地做而不会崩溃

for (unsigned short int i = 0; i < bricks_amount_; i++){


bricks_[i]->handle_ = new GameObject2D(); <----------   There will not be CRASH!
}

【讨论】:

  • 这是不正确的 - 使用 malloc,您仍然会得到一个未初始化的数组(需要通过放置构造函数初始化!)。另外,这样的话,你需要使用bricks[i].handle_
  • 你仍然绕过了构造函数(记住,这是 C++),如果 Brick 类发生变化(更准确地说:接收非 POD 成员),你可能会遇到麻烦(好吧,你仍然可以调用为 ::std::string、::std::vector 或任何其他类 ::myNamespace::MyClass 使用的每个成员的适当放置构造函数 - 并在每次 Brick 类更改时更改循环)。
  • 它看起来像一个 - 但实际上从未创建 Brick,因为使用 malloc 而不是 new Brick[n],它会调用构造函数。
  • @ATulSingh 你把我推向了一个有趣的question,关于未定义的行为。显然,在当前情况下,它是可以的,但是一旦将构造函数添加到类中,我们就会收到 UB...
  • @ATulSingh 必须纠正自己 - 提到的线程越来越多,即使对于 POD 对象,它似乎也是未定义的行为。
猜你喜欢
  • 2021-12-14
  • 2013-03-02
  • 2018-05-16
  • 1970-01-01
  • 2017-06-03
  • 2022-01-14
  • 1970-01-01
  • 2012-12-07
相关资源
最近更新 更多