c++: 是否会自动delete?

原创 2017年03月01日 16:57:49

一直以来对于C++内存管理部分存在一些小疑问,尤其是涉及到内存泄漏的知识,我觉得还是有必要提出来,以加深印象。


问题1:new了一块内存,一定要手动delete吗?什么时候系统会自动帮助我们delete?

回答:首先C++内存区域分为5个:

  • 全局区(静态区)
  • 常量区
  • 程序代码区

    不过我们使用的,一般都是栈、堆。比如以下这段代码:

#include <iostream>
#include <string>
using namespace std;


class Node {
public:
    Node(int id) {
        cout << "Constructor: " << id << endl;
        this->id = id;
    }

    ~Node() {
        cout << "Destructor: " << this->id << endl;
    }

private:
    int id;
};


int main() {
    Node node1(1);
    Node* node2 = new Node(2);

    // ...do something

    return 0;
}

需要说明的无非就是,node1是在栈上分配的,而node2则使用了堆内存。这里有个结论:对于栈上分配的变量、对象,程序结束的时候,由系统来回收内存;而堆上分配的内存,则需要程序员自行管理,最后一定要记得delete来显式释放堆内存。也就是说,new和delete一定要成对出现。

对于上面这个例子,输出结果是:

Constructor: 1
Constructor: 2
Destructor: 1

node2占用的堆内存没有得到delete,它的destructor也就没有调用。这样,内存泄漏就发生了,我们在Linux系统上可以使用Valgrind这个工具来检测c/c++程序的内存泄露,或者分析内存的使用情况。使用命令:

valgrind –tool=memcheck –leak-check=full ./out
Valgrind的检测结果

可以看到,在“defintely lost”这一行显示有4个byte的内存发生泄漏了,对应的就是一个Node(即node2)的大小。


问题2:Destructor的作用是什么?什么时候需要写destructor?

回答:简单来说,析构函数就是释放本对象占用的内存,避免内存泄漏的。一般来说,我们在析构函数中写代码,是为了在释放本对象之前,释放其成员变量所使用的堆内存。所以,有时候,析构函数的函数块内可以什么都不写,但有时候就必须写,具体看以下:
(1)当我们定义的类中的成员没有指针变量(及其申请的对象),比如用的都是基本类型:int、char等,或者已经完美封装的STL类型:string、vector、list的时候,可以不写析构函数。因为对于基本类型,是分配在栈上,程序结束后会自动回收;而对于STL类型,如string类,就算内部(给char数组)动态分配了堆内存,但是STL已经帮我们写好它的destructor了,在它的destructor中给char数组delete;而且,string对象是在栈上分配的。所以,程序结束后,系统会帮我们回收这个string对象。
(2)如果类成员中存在指针变量,在constructor或者别的成员函数中分配了内存,那么必须在destructor中delete。这样,系统在回收这个类的实例的内存时,才会完全把其引用的所有堆内存释放掉。

版权声明:本文为博主原创文章,未经博主允许不得转载。

C++中遍地New却不见delete疑问重重

在上篇博客中,大概了解了tinyxml工具的架构,那这篇博客,我们详细讲述如何利用tinyxml操纵xml。以及在操作的过程中,我们应该注意的问题。            首先把tinyxml源文...
  • llhhyy1989
  • llhhyy1989
  • 2012年11月06日 09:23
  • 7037

C++ new一次,delete多次探讨

《问题》危险的代码:    int* p=new int(1);    delete p;    delete p;   探讨一:    连续两次对同一个指针delete ...
  • luoluoxiaocainiao
  • luoluoxiaocainiao
  • 2014年02月23日 20:16
  • 2686

浅谈 C++ 中的 new/delete 和 new[]/delete[]

在 C++ 中,你也许经常使用 new 和 delete 来动态申请和释放内存,但你可曾想过以下问题呢? new 和 delete 是函数吗?new [] 和 delete [] 又是什么?什么时候...
  • hazir
  • hazir
  • 2014年03月17日 22:49
  • 97337

C++ delete报错原因

C++ delete报错原因释放内存两种方式:new deletenew [] delete []出错现象:1.执行delete语句时,程序直接弹窗,崩溃。2.执行delete语句时,程序卡死。将...
  • tianxia_taiping
  • tianxia_taiping
  • 2013年09月02日 16:33
  • 7084

关于C++中delete释放内存时效性问题

如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033测试示例:#include using namespace std; int main...
  • itas109
  • itas109
  • 2017年04月01日 14:27
  • 2477

c++详解【new和delete】

说起new和delete,了解过c++的人应该都知道吧,它是用来分配内存和释放内存的两个操作符。与c语言中的malloc和free类似。 c语言中使用malloc/calloc/realloc/fr...
  • xxpresent
  • xxpresent
  • 2016年11月21日 09:22
  • 1356

C++11中delete的使用

出处:http://blog.csdn.net/fengbingchun/article/details/52475108 In C++11, defaulted and deleted...
  • jiaoyongqing134
  • jiaoyongqing134
  • 2017年01月16日 14:14
  • 819

C++的new 和 delete 操作符重载。

测试代码: // test.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include using name...
  • chjjunking
  • chjjunking
  • 2014年03月04日 12:16
  • 2643

delete 和 delete []的真正区别

c++中对new申请的内存的释放方式有delete和delete[两种方式,到底这两者有什么区别呢? 1.我们通常从教科书上看到这样的说明: delete 释放new分配的单个对象指针指向的内...
  • cbNotes
  • cbNotes
  • 2014年08月28日 17:18
  • 36430

在类中delete自己会不会有问题??

这个问题很多人都在问,很多人有不同答案,有一点是可以肯定,就是千万别在析构函数中调用delete this,因为会造成死递归(delete this调用后会再次调用析构函数,再次delete this...
  • djqkangta
  • djqkangta
  • 2016年02月17日 21:09
  • 746
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++: 是否会自动delete?
举报原因:
原因补充:

(最多只允许输入30个字)