动态内存调整字符数组大小
Dynamic memory resize char array
我正在尝试调整 char 数组的大小,我已遵循:
Resizing a char[] at run time
然后:
我做过这样的事情:
// 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;
}
但如果我这样做:
// 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;
对我来说这应该没问题,但如果错误,我该如何自动分配内存?
P.S:我知道可以使用 std::vector
但我想尽可能使用它。
realloc()
用于调整使用 malloc()
分配的 C 样式数组的大小。 realloc()
不能在 C++ 代码中使用,以调整在动态范围内使用 new
.
实例化的 C++ 对象的大小
C++ 中没有 realloc()
的等效项。在 C++ 中,调整现有数组大小的最简单方法是:必须在具有 new []
的动态范围内构造一个新数组,将现有数组中的值 std::copy
编辑到新数组,然后旧数组 delete[]
-ed.
工作量很大。这将涉及很多不必要的默认构造和复制赋值(如果你的 类 没有默认构造函数,你就会被卡住)。使用 placement-new 和手动 copy/move 构造函数可以优化其中的一些工作。但这是很多工作。这就是为什么您应该使用 std::vector
。它会为您做这一切,而且做的很正确。
您自己使用 new
和 delete
没有任何问题,如您所愿。这是很好的学习经验,以便了解如何正确管理动态作用域的对象。充分了解低级动态作用域的工作原理是很有价值的知识。然而,在某些时候,所有这些都变成了真正的旧的、不平凡的任务,涉及动态范围的对象,变得乏味且容易出错,并且是一个主要的时间燃烧器。
到那时,保持理智的唯一方法是开始使用 C++ 库容器,它会为您处理所有垃圾工作。总之:使用 std::vector
,让它为您完成所有这些工作。
要使用 realloc
,内存必须已分配给 malloc
或该系列中的其他函数。
在C++中处理char
的字符串最简单的方法是使用std::string
.
您不能使用 realloc()
运算符在指针分配的内存上使用 new
。您可以使用此函数调整指针的大小
char* Resize(char*& old,long int length,long int resize_to)
{
char* new_ptr;
new_ptr = new char[ resize_to ];
long int least = ( length < resize_to ) ? length : resize_to;
for(long int i = 0;i < least ; ++i)
new_ptr [i] = old[i];
delete [] old;
old = nullptr;
return new_ptr;
}
这可能有效,不要忘记 delete[]
在不再需要该指针后重新分配该指针,否则您将不得不担心内存泄漏
尽管您可能希望我们 std::string
或 std::vector
或创建您自己的动态扩展堆栈 class。
我正在尝试调整 char 数组的大小,我已遵循: Resizing a char[] at run time
然后:
我做过这样的事情:
// 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;
}
但如果我这样做:
// 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;
对我来说这应该没问题,但如果错误,我该如何自动分配内存?
P.S:我知道可以使用 std::vector
但我想尽可能使用它。
realloc()
用于调整使用 malloc()
分配的 C 样式数组的大小。 realloc()
不能在 C++ 代码中使用,以调整在动态范围内使用 new
.
C++ 中没有 realloc()
的等效项。在 C++ 中,调整现有数组大小的最简单方法是:必须在具有 new []
的动态范围内构造一个新数组,将现有数组中的值 std::copy
编辑到新数组,然后旧数组 delete[]
-ed.
工作量很大。这将涉及很多不必要的默认构造和复制赋值(如果你的 类 没有默认构造函数,你就会被卡住)。使用 placement-new 和手动 copy/move 构造函数可以优化其中的一些工作。但这是很多工作。这就是为什么您应该使用 std::vector
。它会为您做这一切,而且做的很正确。
您自己使用 new
和 delete
没有任何问题,如您所愿。这是很好的学习经验,以便了解如何正确管理动态作用域的对象。充分了解低级动态作用域的工作原理是很有价值的知识。然而,在某些时候,所有这些都变成了真正的旧的、不平凡的任务,涉及动态范围的对象,变得乏味且容易出错,并且是一个主要的时间燃烧器。
到那时,保持理智的唯一方法是开始使用 C++ 库容器,它会为您处理所有垃圾工作。总之:使用 std::vector
,让它为您完成所有这些工作。
要使用 realloc
,内存必须已分配给 malloc
或该系列中的其他函数。
在C++中处理char
的字符串最简单的方法是使用std::string
.
您不能使用 realloc()
运算符在指针分配的内存上使用 new
。您可以使用此函数调整指针的大小
char* Resize(char*& old,long int length,long int resize_to)
{
char* new_ptr;
new_ptr = new char[ resize_to ];
long int least = ( length < resize_to ) ? length : resize_to;
for(long int i = 0;i < least ; ++i)
new_ptr [i] = old[i];
delete [] old;
old = nullptr;
return new_ptr;
}
这可能有效,不要忘记 delete[]
在不再需要该指针后重新分配该指针,否则您将不得不担心内存泄漏
尽管您可能希望我们 std::string
或 std::vector
或创建您自己的动态扩展堆栈 class。