加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C内存释放

发布时间:2020-12-16 09:42:04 所属栏目:百科 来源:网络整理
导读:我正在尝试测试我对C内存分配的理解. 对于以下程序: { int a=0;} 由于a是从堆栈中分配的,因此当变量超出范围时应该释放它,对吧? 好的,够容易的.这个案子怎么样: { Matrix m(50,20);} 假设有一个矩阵类,我正在创建一个包含50行和20列的新类.显然,并非所有
我正在尝试测试我对C内存分配的理解.

对于以下程序:

{
    int a=0;
}

由于a是从堆栈中分配的,因此当变量超出范围时应该释放它,对吧?

好的,够容易的.这个案子怎么样:

{
    Matrix m(50,20);
}

假设有一个矩阵类,我正在创建一个包含50行和20列的新类.显然,并非所有内存都可以从堆栈中分配,因为50和20可以在运行时填充.所以我猜测在构造函数中的某个地方,它们会从堆中分配内存.

当超出范围时,调用m上的析构函数?那个析构函数应该释放(删除)它分配的内存?

现在真的很难:

{
    Matrix t;
    {
        Matrix m(50,20);
        t=m;
    }
}

那么会发生什么?是否被分配到m的内存位置?或者它是否以m为单位复制数据?如果t是对m的引用,那么当m超出范围时会发生什么? m上的析构函数是否被调用?还是等到t超出范围来调用t / m的析构函数?

解决方法

When that goes out of scope the destructor on m is called? And that
desctructor should deallocate (delete) the memory it allocated?

是的,一般是的.

Now it really gets hard:

{
    Matrix t;
    {
        Matrix m(50,20);
        t=m;
     }
}

What happens then? Does t get assigned to the memory location of m? or does it do a copy of the data in m?

会发生什么是调用赋值运算符:

t.operator=(m);

作为Matrix的实现者,您需要确保有效的语义.有几种可能的方法:

>赋值运算符可以复制m的数据.在这种情况下,终身和所有权都没有困难.但是,在这种方法中,分配成本很高.
>赋值运算符可以使t指向与m相同的数据.这可能是可行的,但需要非常小心以确保正确管理数据的生命周期,并且修改一个矩阵不会意外地修改另一个矩阵.一种方法是将reference-counted pointer保留为数据,并在修改数据时使用copy-on-write.一些较早的std :: string实现属于这种类型.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读