【问题标题】:Do functions clear dynamic memory upon exiting scope?函数在退出范围时会清除动态内存吗?
【发布时间】:2012-06-04 21:07:57
【问题描述】:

在 C++ 中,函数如何处理在退出函数作用域时动态分配的内存?这块内存是清空了,还是可以传回主块?

在上下文中:我有一个函数,我将一个指向 double 的指针传递给它以用作数组。我在函数内动态分配内存,初始化元素并退出函数。

            void my_func(double* ptr){
            ptr = new double[2];
            ptr[0] = 15; ptr[1] = 10;
            }

在主块中,然后我使用新分配的数组。

            int main(){
            double* ptr;
            my_func(ptr);
            cout << ptr[0] + ptr[1] << endl;
            delete[] ptr;
            return 0;

这行得通吗?这种方法是否存在危险/陷阱?

【问题讨论】:

    标签: c++ function scope dynamic-memory-allocation


    【解决方案1】:

    在 C++ 中,函数如何处理退出函数作用域时动态分配的内存?这块内存是清空了,还是可以传回主块?

    在 C++ 中,手动(动态)分配的内存必须手动释放。

    在上下文中:我有一个函数,我将一个指向 double 的指针传递给它以用作数组。我在函数内动态分配内存,初始化元素并退出函数。

    您正在按值获取指针,因此虽然您可以更改指针指向的内容,但您不能更改指针本身。这样做只会更改指针的本地副本。如果您通过引用获取指针,那么它将起作用:

    void my_func(double*& ptr)
    {
        ptr = new double[2];
        ptr[0] = 15; ptr[1] = 10;
    }
    

    这行得通吗?这种方法是否存在危险/陷阱?

    它大部分都可以工作,但由于相关的陷阱,它不是 C++ 的方式。最好使用vector

    std::vector<int> my_func()
    {
        std::vector<int> buffer;
        buffer.push_back(15);
        buffer.push_back(10);
        return buffer;
    }
    

    【讨论】:

    • so while you can change(as defined by the standards) the contents of what the pointer points to - 只有当指针已经分配了一些内存时才为真。在这种情况下,ptr = new double[2] 将使指针ptr 指向合法分配的内存,通过这一步,ptr(在 main 中)对 ptr(在函数中)的承载结束。
    【解决方案2】:

    这行得通吗?这种方法是否存在危险/陷阱?

    只要没有出错,它就可以工作。如果抛出异常,它通常会泄漏内存。为避免这种情况,您通常希望释放某个类的析构函数中的内存,然后创建具有自动存储持续时间的该类的实例。这意味着它会在超出范围时被销毁,并(反过来)释放它所控制的内存。

    标准库已经有多种容器可以做到这一点。你所拥有的最接近std::vector,但也有std::dequestd::list 等。

    【讨论】:

      猜你喜欢
      • 2018-08-11
      • 1970-01-01
      • 1970-01-01
      • 2013-01-23
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 2015-02-11
      • 1970-01-01
      相关资源
      最近更新 更多