我通常回避不必要的 C ++ 功能,但随着时间的推移,我无法避免面对我的小鬼。最近的一次是operator new[]
和存在记忆问题的可能性。
char *playerNewNames = new char[numPlayers][50];
很高兴知道我们不需要这么多指针*
的间接性,并且我对使用malloc
的C迭代感到自信,但上面的步骤似乎太过分了。我的编译器没有抱怨,但我想确保我将得到一个大小为numPlayers
的数组,每个索引一个50个字符的部分。我将如何解除分配呢?
我会尝试delete[][]
,但即使不抛出它也不是百分之百明显它会清理所有东西,而不是我的迭代。请有人解释一下。提前谢谢。
答案 0 :(得分:4)
char *playerNewNames = new char[numPlayers][50];
是个错误。您应该收到编译器错误。正确的语法是:
char (*playerNewNames)[50] = new char[numPlayers][50];
并删除它:
delete[] playerNewNames;
然而,更好的选择是不使用C风格的数组,而不是使用new
。相反,请使用为您管理内存的容器类,例如std::vector
或std::array
。
答案 1 :(得分:0)
解除分配数组的唯一正确方法是使用delete[]
delete
释放单个对象,而delete[]
处理对象数组。
没有delete[][]
或delete[][][]
答案 2 :(得分:0)
看起来你想要一个数组数组。
在我看来,最易读的方法是使用类型别名。
typedef char PlayerName[50];
PlayerName* playerNewNames = new PlayerName[numPlayers];
delete [] playerNewNames;
如果你想要一个指向数组的指针数组,你需要进行迭代,但是因为你想要所有的"内部"数组具有相同的大小,并且在编译时已知,这似乎是一个坏主意。
了解std::vector
和std::array
。