C++中的new有realloc的作用吗?如果没有什么可以代替realloc
3条回答 默认 最新
关注
引自免费微信小程序:皆我百晓生
在C++中,
new
运算符主要用于动态内存分配,它不直接提供像C语言中的realloc
那样的功能,即在不改变指针地址的情况下调整已分配内存块的大小。但是,你可以通过一些策略来实现类似的功能。一种方法是先释放原有的内存,然后为更大的内存块重新申请。这可能会导致数据丢失,因为你需要手动复制已有的数据到新的内存位置。以下是这种方法的一个示例:
#include <iostream> #include <cstdlib> class MyClass { public: int value; }; int main() { // 分配一个MyClass对象的空间 MyClass* myObject = new MyClass; // 设置值 myObject->value = 42; // 假设我们需要更多的空间 size_t newSize = sizeof(MyClass) * 2; // 想要两倍大的空间 // 释放原来的内存 delete myObject; // 为新的内存块申请空间 try { myObject = new MyClass[newSize]; } catch (std::bad_alloc& e) { std::cerr << "Memory allocation failed: " << e.what() << '\n'; return EXIT_FAILURE; } // 复制数据到新内存 for (size_t i = 0; i < newSize / sizeof(MyClass); ++i) { new (&myObject[i]) MyClass(*myObject); } // 现在你可以访问并修改新内存区域了 myObject[1].value = 99; // 不要忘记正确地删除数组 for (size_t i = 0; i < newSize / sizeof(MyClass); ++i) { myObject[i].~MyClass(); } delete[] myObject; return 0; }
另一种更安全但可能效率稍低的方法是使用
std::unique_ptr
和std::make_unique_with_allocator
,配合std::allocator
的重载版本来实现内存扩张。然而,这种方法并不常见,因为通常情况下你会使用容器类(如std::vector
)来自动管理内存和增长空间。如果你想要类似于
realloc
的行为,并且不想手动处理内存管理和数据复制,那么建议使用std::vector
,它会自动管理内存并在需要时进行扩展。例如:#include <iostream> #include <vector> int main() { std::vector<int> vec(10); // 创建一个包含10个元素的向量 // 向量内部已经预留了一定的额外空间用于扩展,所以这个操作不会立即触发 resize vec.push_back(42); // 如果扩展到了预先预留的空间之外,std::vector会自动增加容量 vec.resize(20, 0); // 现在你可以访问vec[19]并赋值 vec[19] = 99; return 0; }
在这个例子中,
std::vector
会自动在需要时扩大其容量,而无需用户显式地处理内存分配和数据复制。解决 1无用