C ++中类对象属性的内存管理

问题描述 投票:0回答:1

对不起,如果您之前曾问过这个问题。我搜索了互联网,但找不到明确的答案。

这里是问题:

假设我有一个名为Object的公共类,它具有2个属性。一个是int attr1,另一个是char * attr2。构造函数是(我有一个头文件):

Object::Object(int param1, char * param2) 
{
  attr1=param1; 
  attr2 = new char[strlen(param2)+1]; // I understand that by doing this the values are stored in the heap
  strcpy(attr2, param2); 
}

我知道在类Object的析构函数中,我需要写delete [] attr2

在另一个文件main.cpp中,我用这种方式创建一个新对象:

char * name = "Aname";
Object myObject = new Object(3, name);

据我了解,每当使用new时,该值都存储在堆中。因此,为了避免内存泄漏,必须使用delete。在这里,我使用了new运算符来创建对象。因此,myObject是指向存储在堆中的Object的指针。我将需要这样做:delete myObject当我不再需要它时。

所以这是我的问题:由于myObject指向的对象存储在堆中,是否意味着它的所有属性都存储在堆中(包括attr1,它只是一个int)?如果是这样,我怎么也不必释放它(意味着在析构函数中为其使用运算符delete)?

谢谢您的帮助!

注意:英语不是我的母语,对不起,我的错。

c++ memory heap new-operator delete-operator
1个回答
0
投票

您在第二个示例中显示的代码将无法编译,因为myObject未声明为指针,例如:

char * name = "Aname";
Object * myObject = new Object(3, name); // <-- note the * !

此外,您的其余评论都是正确的。由于myObject是用new创建的,因此其数据成员驻留在动态内存(即堆)中。并且由于您要[[direct用attr2分配new[],因此您需要手动调用delete[] attr2来释放它。但是,attr1没有与new一起被分配,因此您不需要手动调用delete attr1。它的内存由编译器管理,当myObject被销毁时将自动释放。

© www.soinside.com 2019 - 2024. All rights reserved.