我仍然不明白C++运算符 new[](或新[][])
I still don't understand C++ operator new[] (or new[][])
我通常会避开不必要的 c++ 特性,但随着时间的推移,我无法避免面对我的小问题。最近的是operator new[]
和潜在的内存问题。
char *playerNewNames = new char[numPlayers][50];
很高兴知道我们不需要那么多指针*
间接,我对C迭代malloc
很有信心,但上面的步骤似乎太远了。我的编译器没有抱怨,但我想确保我将得到一个大小为numPlayers
的数组,每个数组索引50个字符。我该如何释放这个呢?
delete[][]
,但即使这不会抛出它不是100%明显,它将清理一切,没有迭代在我的部分。有人能解释一下吗?
char *playerNewNames = new char[numPlayers][50];
是一个错误。您应该得到一个编译器错误。正确的语法是:
char (*playerNewNames)[50] = new char[numPlayers][50];
和删除它:
delete[] playerNewNames;
然而,一个更好的选择是不使用c风格的数组,也不使用new
。相反,应该使用为您管理内存的容器类,例如std::vector
或std::array
。
释放数组的唯一正确方法是使用delete[]
delete
释放单个对象,而delete[]
释放一个对象数组。没有delete[][]
或delete[][][]
这类东西
看起来你想要一个数组的数组。
在我看来,最易读的方法是使用类型别名。
typedef char PlayerName[50];
PlayerName* playerNewNames = new PlayerName[numPlayers];
delete [] playerNewNames;
如果你想要一个数组指针的数组,你将需要迭代,但由于你希望所有的"内部"数组具有相同的大小,并且它在编译时是已知的,这似乎是一个坏主意。
了解std::vector
和std::array
相关文章:
- 声明C++数组(带或不带 "new" 关键字)
- 在功能块中使用新运算符时存在于堆或堆栈上?
- 删除使用 new 创建的 2D 或 3D 指针
- 插入容器的容器(如果是新的或附加到现有容器)
- C++ 分配器:运算符新建或放置新
- 有没有一种方法可以从函数中返回一个新对象或对现有对象的引用
- r-在Rcpp和C++之间转换矢量(使用Rcpp::as或Rcpp:::wrap)是否会创建一个新的矢量并复制元素
- 将 malloc 转换为新的或 std::vector
- 在编译时将整数和分数部分宏组合成一个新的宏或双精度
- 由于新()或malloc,内存泄漏
- 为什么要在不同的连接(新的InternetOpen和New Internet Connect)上对HttpsendReq
- C++对现有变量或新变量的条件引用
- 'new'关键字如何工作?我最近才知道新关键字
- C 检索列表中现有或新项目的引用
- 使用引用或新值的C++算法
- 了解 GCC 5 的_GLIBCXX_USE_CXX11_ABI或新的 ABI
- 我仍然不明白C++运算符 new[](或新[][])
- Origin -常量或新类型
- 将文本文件的内容一个字符一个字符地读入矢量,不跳过空白或新行
- 有没有办法获得正在运行或新打开的浏览器窗口的IExplorerBrowser接口,用于后续的BrowseToXXX调用