在动态分配内存时使用指定大小

Use of specifying size while dynamically allocating memory

我想了解在使用 new 关键字动态分配内存时指定大小的确切用途是什么,以及在释放该内存时它扮演什么角色。

 char* c = new char; // Not specifying size here
 c[0] = 'h';
 c[1] = 'i';
 c[2] = '[=10=]';
 delete c;        

 char* d = new char[3];
 d[0] = 'h';
 d[1] = 'i';
 d[2] = '[=10=]';
 delete[] d;

我知道在第一个例子中我访问了错误的内存部分,而且很明显通过调用 delete,它不会释放所有分配的内存,但我试图理解还有什么可以去在这种情况下调用 delete 时出错。

根据我的理解,为了跟踪正在分配的内存并在需要时正确释放它,需要指定大小。请提供这部分的一些信息。

指定大小分配一个数组。如果您的类型是 int[3],它将为 3 int 分配 space。如果类型只是 int,它只会分配足够的内存给 1 int.

And from my understanding, in order to keep track of memory being allocated and for properly freeing it up whenever required, size specification is required. Please provide some information on this part.

您需要跟踪分配了多少内存,以免越界。至于释放内存,deletedelete[] 就可以了。他们会处理释放正确数量的内存,而不管您是否在程序中跟踪它。

代码的第一个版本为一个字符分配 space,这是完全有效的,您可以使用 new 分配单个事物或使用 new[] 分配一组事物.问题是你然后你去践踏你不拥有的所有内存,这是未定义的行为。

当您调用 delete 时没有任何问题,您正在删除一个有效的、先前分配的指针。可能会出错的是,如果你正在改变你不拥有的记忆。

在第二种情况下,您分配了 3 个字符并且操作有效。

请注意,在 C++ 中,您应该对字符串数据使用 std::string,对可变长度分配使用 std::vector,对固定长度分配使用 std::array

"what else could go wrong in this scenario"

好吧,这是未定义的行为。这意味着所有保证都消失了——永远消失了。硬盘格式化了吗?一切都可能出错,所以也是。

只需使用std::string。节省硬盘。