C++ new char[size] 和 new char[size]() 的区别

标签 c++ memory-management dynamic-memory-allocation c-strings

tldr;为带括号和不带括号的原始数组分配内存有什么区别?例如

char * text = new char[size];

对比

char * text = new char[size]();

全文:

今天我在编写一些代码时遇到了一个奇怪的问题。我创建了一个包含 cstring 成员变量 text 的类。

Class SomeClass
{
   private:
      char * text;
      ...
}

所述类的构造函数将像这样使用动态分配的内存初始化文本

text = new char[size];

运行时,我的程序会提示用户输入,将输入存储在 cstring 中,然后将其显示给用户。问题是,当我使用 cout 将 cstring 显示回用户时,垃圾会出现在字符串的末尾。当我用调试器单步执行程序时,错误消失了,cstring 将正常打印。该问题仅在运行程序时出现,在使用调试器单步执行时从未出现过。

在确保我的 cstring 具有适当的空终止字符、为用户输入分配了足够的内存、检查了数组边界以及许多其他事情之后,我最终通过在分配时在方括号后添加括号来解决了这个问题像这样的 cstring 内存

text = new char[size]();

为什么这解决了我的问题?为带括号和不带括号的原始数组分配内存有什么区别?

最佳答案

感谢 Igor Tandetnik 和 M.M.在评论中。括号将数组中的字符初始化为 0 而不是垃圾。这意味着 cout 将在遇到第一个 0 时停止打印字符,而不是打印字符串中包含的所有垃圾。

关于C++ new char[size] 和 new char[size]() 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41082924/

相关文章:

c++ - 获取指向已注册 QML 类型的指针

c++ - 如何从重载解析中删除函数?

c++ - STL 对比较 - 第一个元素

c - 一次释放多个动态分配的内存可以吗?

c++ - C++中的二维动态内存分配数组

c - 我如何使用结构?

c++ - 在头文件中获取函数原型(prototype)中的指针数组 : function declared void

c++ - 复制内存块

java - 我的 Java 应用程序内存不足

c - 使用指针的结构会出错