据我所知,realloc
中C
的{{1}}的{{1}}并没有C++
的{{1}}那样的确切替代方案。但是,当我使用new
中的malloc
来更改realloc
运算符分配的内存时,它可以正常工作。
像下面的代码一样使用这两个(C++
和new
)是否安全?否则会导致某些问题?
new
在这种情况下,我应该使用哪个运算符释放内存:realloc
中的#include <iostream>
#include <cstdlib>
int main()
{
int size = 5;
int * arr = new int[size]{ 1,3,5,7,9 };
for (int i = 0; i < size; i++)
std::cout << *(arr + i) << (i < size - 1 ? ' ' : '\n');
size++;
arr = (int*)realloc(arr, size * sizeof(int));
*(arr + size - 1) = 11;
for (int i = 0; i < size; i++)
std::cout << *(arr + i) << (i < size - 1 ? ' ' : '\n');
delete[] arr;
//free(arr);
std::cin.get();
return 0;
}
?
答案 0 :(得分:5)
否,行为是 undefined 。您只能在通过调用delete[]
获得的指针上调用new[]
。
使用std::vector
将导致所有这些内存问题都消失。
答案 1 :(得分:3)
这是不安全的。 new
仅应与delete
或delete[]
匹配-与realloc
一起使用是危险的,并可能导致安全风险。
而且,为什么首先要使用new
和delete
?如果您真的想自己管理内存,请使用std::vector
之类的容器或std::unique_ptr
之类的智能指针。
答案 2 :(得分:0)
请勿将c内存函数与c ++内存函数混合使用,否则您会遇到麻烦。
查看此: What is C++ version of realloc(), to allocate the new buffer and copy the contents from the old one?