Jas*_*son 3 c++ memory-management
我正在尝试测试我对C++内存分配的理解.
对于以下程序:
{
int a=0;
}
Run Code Online (Sandbox Code Playgroud)
由于a
从堆栈中分配,因此当变量超出范围时应该释放它,对吧?
好的,够容易的.这个案子怎么样:
{
Matrix m(50, 20);
}
Run Code Online (Sandbox Code Playgroud)
假设有一个矩阵类,我正在创建一个包含50行和20列的新类.显然,并非所有内存都可以从堆栈中分配,因为50和20可以在运行时填充.所以我猜测在构造函数中的某个地方,它们会从堆中分配内存.
当超出范围时,析构函数会m
被调用吗?那个析构函数应该释放(删除)它分配的内存?
现在真的很难:
{
Matrix t;
{
Matrix m(50, 20);
t=m;
}
}
Run Code Online (Sandbox Code Playgroud)
那么会发生什么?是否被分配到m的内存位置?或者它是否以m为单位复制数据?如果t是对m的引用,那么当m超出范围时会发生什么?m上的析构函数是否被调用?还是等到t超出范围来调用t/m的析构函数?
当超出范围时,调用m上的析构函数?那个析构函数应该释放(删除)它分配的内存?
是的,一般是的.
现在真的很难:
{
Matrix t;
{
Matrix m(50, 20);
t=m;
}
}
Run Code Online (Sandbox Code Playgroud)
那么会发生什么?是否被分配到m的内存位置?或者它是否以m为单位复制数据?
会发生什么是调用赋值运算符:
t.operator=(m);
Run Code Online (Sandbox Code Playgroud)
Matrix
确保有效语义由您(实现者)决定.有几种可能的方法:
m
数据.在这种情况下,终身和所有权都没有困难.但是,在这种方法中,分配成本很高.t
指向与之相同的数据m
.这可能是可行的,但需要非常小心以确保正确管理数据的生命周期,并且修改一个矩阵不会意外地修改另一个矩阵.实现此目的的一种方法是保留指向数据的引用计数指针,并在修改数据时使用copy-on-write.一些较旧的实现std::string
属于这种类型.