class myclass {
public:
int* ptr;
int get() { return *ptr; }
~myclass() {
free(ptr);
ptr = nullptr;
std::cout << "destruct" << std::endl;
};
myclass() {
std::cout << "default"<< std::endl;
ptr = (int*)malloc(sizeof(*ptr));
*ptr=999;
};
myclass(const myclass&) { std::cout << "copy" << std::endl; };
};
myclass func()
{
myclass a;
cout << "func: " << a.get() << endl;
cout << "func addr: " << a.ptr << endl;
return a;
}
int main()
{
myclass a= func();
cout << "main: " << a.get() << endl;
cout << "func addr: " << a.ptr << endl;
}
结论:
defolt
func: 999
func addr: 000001AF1E7CEF90
main: 999
func addr: 000001AF1E7CEF90
destruct
当我们从具有标准复制构造函数的函数返回对象时,我想直观地设计一种不愉快的情况,之后内存被释放并且对象现在引用无效内存,但由于某种原因 func () 函数不调用析构函数。而且,由于某种原因,连复制构造函数都没有被调用。为什么?
因为这里
没有副本。
func立即创建一个对象a(main我总是混淆它是如何正确调用的......复制省略,似乎......但从一些C ++开始,这种行为是强制性的)。使用地址的输出完成代码
a:我得到它
因此,如您所见,在 in和 in
a中都是相同的。funcmain更新
是的,撒了一点谎。这似乎是 NRVO,与 RVO 不同,它不是强制优化。见这里 - https://en.cppreference.com/w/cpp/language/copy_elision