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

很抱歉,以前是否有人问过这个问题。我搜索了互联网,但找不到明确的答案。

问题出在这里:

假设我有一个名为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)?

谢谢您的帮助!

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

zwn_annan 回答:C ++中的类对象属性的内存管理

您在第二个示例中显示的代码将无法编译,因为

  • myObject未声明为指针

  • 在C ++ 11和更高版本中,非常量 char*指针不能指向字符串文字。

所以您需要这个:

Object::Object(int param1,const char * param2) 
{
  attr1 = param1; 
  attr2 = new char[strlen(param2)+1];
  strcpy(attr2,param2); 
}
const char * name = "Aname";
Object * myObject = new Object(3,name); // <-- note the * !

话虽如此,您其余的评论都是正确的。由于myObject是用new创建的,因此它的数据成员驻留在动态内存(即堆)中,并且您必须调用delete myObject来销毁它,并使用完后释放其内存。而且,由于您直接使用attr2new[]分配内存,因此您需要手动调用delete[] attr2来释放它。

但是,您不是直接 attr1new分配内存,因此您不需要手动调用delete attr1attr1的内存由编译器管理,并且在myObject被销毁时会自动释放。

简而言之,当某个东西由功能/运算符显式分配时,必须使用相应的功能/运算符将其显式释放,例如:

  • 使用C ++ newnew[]运算符显式分配某些内容时,必须分别使用deletedelete[]运算符显式释放该内容。 / p>

  • 如果使用C运行时(m|c|re)alloc()函数显式分配了某些内容,则必须使用C运行时free()函数将其显式释放。

  • 如果某些内容是使用Win32 API (Local|Global)Alloc()(Local|Global)ReAlloc()函数显式分配的,则必须使用Win32 API (Local|Global)Free()函数显式释放该对象。

本文链接:https://www.f2er.com/2973890.html

大家都在问