您的位置:首页 > 健康 > 养生 > c++ 函数内对象的释放

c++ 函数内对象的释放

2025/5/1 0:28:12 来源:https://blog.csdn.net/b1tb1t/article/details/139654123  浏览:    关键词:c++ 函数内对象的释放
void someFunction() {MyClass obj = MyClass();
}void someFunction() {MyClass obj = new MyClass();}void someFunction() {MyClass* obj = new MyClass(); 
}void someFunction() {std::unique_ptr<MyClass> obj = std::make_unique<MyClass>(); 
}在函数中用这4种方式内存会不会在函数结束后释放,有啥差异
void someFunction() {  MyClass obj;  
}

在这个例子中,obj 是一个局部对象,它在栈上被创建和分配内存。当 someFunction 函数结束时,obj 的生命周期结束,它的析构函数会被自动调用,其占用的内存(在栈上)也会被自动释放。

void someFunction() {  MyClass obj = new MyClass(); // 这是错误的  
}

这个代码实际上是有问题的,因为 new MyClass() 返回一个指向 MyClass 对象的指针,但这里尝试将其赋值给一个 MyClass 类型的对象,而不是指针。这会导致编译错误。如果正确的写法是使用指针(如下一个例子所示),则内存不会在函数结束时自动释放。new关键字会在堆上分配内存并返回一个指向新分配的内存的指针,因此你不能将它赋值给一个对象,而应该赋值给一个指针。

void someFunction() {  MyClass* obj = new MyClass();   
}

在这个例子中,obj 是一个指向 MyClass 对象的指针,该对象在堆上通过 new 运算符被创建和分配内存。当 someFunction 函数结束时,obj 指针本身(在栈上)会被销毁,但它所指向的对象在堆上的内存并不会被自动释放。这会导致内存泄漏,除非你在函数外部或其他地方显式地使用 delete obj; 来释放内存。

void someFunction() {  std::unique_ptr<MyClass> obj = std::make_unique<MyClass>();   
}

在这个例子中,obj 是一个 std::unique_ptr 类型的智能指针,它拥有(unique ownership)一个通过 std::make_unique() 在堆上创建的 MyClass 对象。当 someFunction 函数结束时,obj(在栈上)的生命周期结束,它的析构函数会被自动调用。由于 std::unique_ptr 管理着其指向的对象的生命周期,所以它会确保在析构时自动调用 delete 来释放堆上的内存,从而防止了内存泄漏。

总结:

第一种方式(局部对象)会在函数结束时自动释放内存(在栈上)。
第二种方式(错误的赋值)会导致编译错误。
第三种方式(裸指针)不会在函数结束时自动释放内存(在堆上),需要手动释放。
第四种方式(智能指针)会在函数结束时自动释放内存(在堆上),通过智能指针的析构函数

用new,在堆中分配了内存,堆上的内存分配,亦称动态内存分配
https://blog.csdn.net/ytusdc/article/details/88621223

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com