对不起,如果您之前曾问过这个问题。我搜索了互联网,但找不到明确的答案。
这里是问题:
假设我有一个名为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
)?
谢谢您的帮助!
注意:英语不是我的母语,对不起,我的错。
您在第二个示例中显示的代码将无法编译,因为myObject
未声明为指针,例如:
char * name = "Aname";
Object * myObject = new Object(3, name); // <-- note the * !
此外,您的其余评论都是正确的。由于myObject
是用new
创建的,因此其数据成员驻留在动态内存(即堆)中。并且由于您要[[direct用attr2
分配new[]
,因此您需要手动调用delete[] attr2
来释放它。但是,attr1
没有与new
一起被分配,因此您不需要手动调用delete attr1
。它的内存由编译器管理,当myObject
被销毁时将自动释放。