因为它具有未动态分配的 int 的地址,所以我认为我不需要删除它。
这是正确的。只需不删除它即可。
你问题的第二部分涉及动态分配的内存。在这里,您需要思考一下并做出一些决定。
假设您的类称为 ex1,在其构造函数中接收一个原始指针,该指针是在类外部动态分配的内存。
作为类的设计者,您必须决定此构造函数是否“拥有”此指针。如果是,则 ex1 负责删除其内存,您应该在类析构函数上执行此操作:
class ex1 {
public:
ex1(int* p_intvar1)
{
ptoint = p_intvar1;
}
~ex1()
{
delete ptoint;
}
int* ptoint;
};
然而,这通常是一个糟糕的设计决策。你必须支持使用这个类的用户读取构造函数上的注释,并记住不要删除在类ex1之外分配的内存。
接收指针并获取其所有权的方法(或构造函数)称为“sink”。
某人会像这样使用这个类:
int* myInteger = new int(1);
ex1 obj(myInteger); // sink: obj takes the ownership of myInteger
// never delete myInteger outside ex1
另一种方法是声明你的类
ex1不负责拥有内存,谁为该指针分配内存就应该负责删除它。类
ex1在其析构函数中不应删除任何内容,并且应该像这样使用:
int* myInteger = new int(1);
ex1 obj(myInteger);
// use obj here
delete myInteger; // remeber to delete myInteger
如果不使用现代C ++,则您的类的用户必须阅读一些文档才能知道他负责删除内容。
如果不使用现代C ++,则您必须在这两个设计决策之间进行选择。
在现代C ++(C ++ 11和14)中,您可以在代码中明确指定事物(即不仅依赖于代码文档)。
首先,在现代C ++中,您避免使用原始指针。您必须在两种“智能指针”之间进行选择:unique_ptr或shared_ptr。它们之间的区别在于所有权。
正如它们的名称所示,唯一指针只由一个人拥有,而共享指针可以由一个或多个人拥有(所有权是共享的)。
唯一指针(std :: unique_ptr)无法复制,只能从一个位置“移动”到另一个位置。如果一个类具有唯一指针作为属性,则明确该类拥有该指针的所有权。如果方法接收唯一指针作为副本,则明确它是一个“汇”的方法(获取指针的所有权)。
您的类ex1可以编写成:
class ex1 {
public:
ex1(std::unique_ptr<int> p_intvar1)
{
ptoint = std::move(p_intvar1);
}
std::unique_ptr<int> ptoint;
};
这个类的用户应该这样使用它:
auto myInteger = std::make_unique<int>(1);
ex1 obj(std::move(myInteger)); // sink
// here, myInteger is nullptr (it was moved to ex1 constructor)
如果您在上面的代码中忘记使用“std::move”,编译器将生成一个错误,告诉您unique_ptr不可复制。此外,请注意您永远不必显式删除内存。智能指针会为您处理这些事情。
constructor
应该是ex1
的构造函数吗? - Codorstd::shared_ptr
,忘记内存管理。 - Jepessennew
的对象(以及删除你所new[]
的数组),但只需执行一次。 - Some programmer dudeobj
和objtoclass
指向同一个对象,您可以使用任何一个来删除该对象。请注意,这时两个指针都将指向垃圾。 - David Schwartz