关于析构函数和C++内存的问题
#include<stdlib.h>

class Student
{

private:

    int id;
    char *name;
public:

    Student();
    ~Student();

};

Student::Student(){
    this->id = 1234;
    char* name = "leon";
    this-> name = name;
};


int main(){

Student leon;

return 0;
}

在C++ 中,初始化一个对象,其实就是在根据这个对象内定义的成员变量的类型预定了一批空间,为什么不需要析构函数中写一些
命令,从而去除这个预定呢?

c++

3个回答

一个C++程序所涉及到的内存区域,一般分为,栈区,堆区,全局区和常量区。
栈区空间,由系统分配和回收,程序代码无需管理,但要防止栈空间过度分配导致栈溢出。
堆区空间,一般是由程序员分配释放,若程序员不释放的话,进程结束时可能由操作系统回收,但如果进程在运行中无释放,导致内存耗尽的话,进程会被终止。
全局空间,也叫静态数据内存空间,存储全局变量和静态变量,全局变量和静态变量的存储是放一块的,初始化的全局变量和静态变量放一块区域,没有初始化的在相邻的另一块区域,程序结束后由系统释放。
常量空间,常量字符串就是放在这里,程序结束后由系统释放。

在程序中,对变量初始化时,一般只有调用new 或 mollac操作的时候,会在堆上分配内存空间,否则都是在栈区或全局区分配空间。因此只要类中的成员变量的初始化都未调用new 或 mollac操作,就没必通过析构函数释放内存。

this-> name = name;
这一行没有意义,因为它就是this-> name = this->name;
name是常量,是编译器就分配好的,所以不需要释放。用new 的才需要在析构函数内释放。

编译器会生成一个析构函数,叫合成析构函数。合成析构函数按照对象创建时的逆序来撤销每个非静态成员,
而且会调用类类型成员的析构函数来释放该成员,所以不需要你写,只是合成析构函数不会释放指针成员,这时就需要写析构函数去释放了。

那个name指向的是个字符串常量,有一个段专门存放,name只是个引用,所以不用释放,也释放不了。

判断需不需要写析构函数,基本上看你有没有为指针成员分配内存就行了

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问