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

相关推荐

  1. c++ 函数对象释放

    2024-06-14 23:02:02       31 阅读
  2. C++算法——函数对象\谓词\置仿函数

    2024-06-14 23:02:02       35 阅读
  3. 函数对象

    2024-06-14 23:02:02       105 阅读
  4. C++函数对象使用

    2024-06-14 23:02:02       39 阅读
  5. C++跨模块释放

    2024-06-14 23:02:02       42 阅读
  6. 释放无用

    2024-06-14 23:02:02       34 阅读
  7. C++】动态内存分配 与 对象动态建立与释放

    2024-06-14 23:02:02       47 阅读
  8. C#面:ASP.NET中常见对象

    2024-06-14 23:02:02       48 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-14 23:02:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-14 23:02:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-14 23:02:02       82 阅读
  4. Python语言-面向对象

    2024-06-14 23:02:02       91 阅读

热门阅读

  1. 深入浅出谈C/C++中static关键字

    2024-06-14 23:02:02       27 阅读
  2. 【总结】项目中用过的设计模式

    2024-06-14 23:02:02       30 阅读
  3. 从零开始精通Onvif之事件处理

    2024-06-14 23:02:02       31 阅读
  4. Codeforces Global Round 26 题解分享

    2024-06-14 23:02:02       32 阅读
  5. 嵌套字典结构

    2024-06-14 23:02:02       34 阅读
  6. jQuery前景以及优劣势

    2024-06-14 23:02:02       29 阅读
  7. 2024年超实用的独立站Dropshipping工具分享!

    2024-06-14 23:02:02       35 阅读