爱编程的小赵 2024-06-02 22:43 采纳率: 30.8%
浏览 12

C++的new函数及空间扩容

C++中的new有realloc的作用吗?如果没有什么可以代替realloc

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-02 22:43
    关注

    引自免费微信小程序:皆我百晓生

    在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_ptrstd::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会自动在需要时扩大其容量,而无需用户显式地处理内存分配和数据复制。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月2日