我有以下C ++代码。因为,内存是动态分配的,所以应该在堆上分配。或者,既然内存已经在声明时分配,而不是在任何构造函数中分配,它是否在堆栈上分配?我需要一个解构函数来释放内存吗?
class param{
public:
char* st = new char[256];
};
以下情况会发生什么?我想这是在堆栈上分配的,不需要使用解构器来释放。
class param{
public:
char st[256];
};
第三种方式是将其写成:
class param{
public:
char* st;
param()
{
st = new char[256];
}
~param()
{
delete[] st;
}
};
上述三个中哪一个是正确的方法?
答案 0 :(得分:2)
因为内存是在声明时分配的,而不是在任何构造函数中分配,是否在堆栈上分配?
不,它仍然是动态分配的。
我是否需要一个解构函数来释放内存?
您按operator new[]
分配内存,因此您需要调用operator delete[]
来解除分配。
其他建议:
考虑使用std::vector
或std::array
,因为它是C ++。
对于第三种情况,请参阅What is The Rule of Three?和Rule-of-Three becomes Rule-of-Five with C++11?
答案 1 :(得分:1)
new
。
在第一个示例中,来自new
的指针被放入类成员中。
可以在堆栈上实例化此类的实例;或者可以通过new
在堆本身上实例化类的实例。无论是在堆上还是在堆栈上,无论实例化类本身的哪种方式,其成员st
将始终指向堆分配的内存。
在第二个示例中,成员st
是该类的一部分。在给出的示例中没有实例化。它只是一个类声明。当类的实例被实例化时,它可以在堆上或堆栈上实例化,在任何一种情况下st
成员都是类的一部分,并且与该特定类实例一起实例化。
至于哪个"正确"这三个例子都是正确的。或者他们三个都可能是错的。这一切都取决于课程的使用方式。通常,第二个或第三个示例是最方便的实现方式,并且可以减少意外。
但是,即使第一个例子是正确的,也有可能提出一些深奥的情况。