我还是不了解C ++ operator new [](或new [] [])

时间:2014-08-13 09:21:02

标签: c++ new-operator

我通常回避不必要的 C ++ 功能,但随着时间的推移,我无法避免面对我的小鬼。最近的一次是operator new[]和存在记忆问题的可能性。

char *playerNewNames = new char[numPlayers][50];

很高兴知道我们不需要这么多指针*的间接性,并且我对使用malloc的C迭代感到自信,但上面的步骤似乎太过分了。我的编译器没有抱怨,但我想确保我将得到一个大小为numPlayers的数组,每个索引一个50个字符的部分。我将如何解除分配呢?

我会尝试delete[][],但即使不抛出它也不是百分之百明显它会清理所有东西,而不是我的迭代。请有人解释一下。提前谢谢。

3 个答案:

答案 0 :(得分:4)

char *playerNewNames = new char[numPlayers][50];是个错误。您应该收到编译器错误。正确的语法是:

char (*playerNewNames)[50] = new char[numPlayers][50];

并删除它:

delete[] playerNewNames;

然而,更好的选择是不使用C风格的数组,而不是使用new。相反,请使用为您管理内存的容器类,例如std::vectorstd::array

答案 1 :(得分:0)

解除分配数组的唯一正确方法是使用delete[]

delete释放单个对象,而delete[]处理对象数组。 没有delete[][]delete[][][]

之类的东西

答案 2 :(得分:0)

看起来你想要一个数组数组。

在我看来,最易读的方法是使用类型别名。

typedef char PlayerName[50];

PlayerName* playerNewNames = new PlayerName[numPlayers];

delete [] playerNewNames;

如果你想要一个指向数组的指针数组,你需要进行迭代,但是因为你想要所有的"内部"数组具有相同的大小,并且在编译时已知,这似乎是一个坏主意。

了解std::vectorstd::array