nik*_*ter 2 c++ dynamic-memory-allocation c++14
我正在尝试调整字符数组的大小,我遵循了: 在运行时调整字符 [] 的大小
然后:
我做过这样的事情:
// this crashes in runtime:
const long SIZE_X = 1048576;
char* Buffsz = new char(sizeof(char));
for(int i = 0; i < (SIZE_X - 2); i++)
{
Buffsz[i] = 'a';
if(realloc(Buffsz, sizeof(char) * i) == NULL) // autoallocate memory
cout << "Failled to reallocate memory!" << endl;
}
Run Code Online (Sandbox Code Playgroud)
但如果我这样做:
// this works without problems.
const long SIZE_X = 1048576;
char* ABuffsz = new char[SIZE_X];
for(int i = 0; i < (SIZE_X - 2); i++)
{
ABuffsz[i] = 'a';
}
cout << "End success! len: " << strlen(ABuffsz) << endl;
Run Code Online (Sandbox Code Playgroud)
对我来说这应该没问题,但如果它错了,我如何自动分配内存?
PS:我知道使用,std::vector但如果可能的话我想使用它。
realloc()用于调整已分配的 C 样式数组的大小malloc()。realloc()不能在 C++ 代码中使用,以调整在动态范围内实例化的 C++ 对象的大小new。
realloc()在 C++ 中没有等效的 for 。在 C++ 中,调整现有数组大小的最简单方法是:必须在动态范围内构造一个新数组,使用new [],将现有数组中的值std::copy-ed 到新数组,然后是旧数组delete[]-ed。
这是很多工作。这将涉及许多不必要的默认构造和复制赋值(如果您的类没有默认构造函数,您就会陷入困境)。使用新放置和手动复制/移动构造函数可以优化其中的一些工作。但这是很多工作。这就是为什么你应该使用std::vector. 它为您完成所有这些工作,而且它正确地完成了这些工作。
使用new和delete你自己并没有错,就像你想做的那样。这是一个很好的学习经验,以便了解如何正确管理动态范围的对象。充分了解低级动态范围的工作原理是很有价值的知识。然而,在某些时候,所有这些都变得非常陈旧,涉及动态范围的对象的非平凡任务变得乏味且容易出错,并且是一个主要的时间消耗者。
在这一点上,保持头脑清醒的唯一方法是开始使用 C++ 库容器,它会为您处理所有垃圾工作。总之:使用std::vector,让它为您完成所有这些工作。
| 归档时间: |
|
| 查看次数: |
9461 次 |
| 最近记录: |