假设一个对象有一个指针类型作为其数据成员。
答案 0 :(得分:2)
指针是复制分配的,正如您所期望的那样(默认行为是成员复制/移动分配所有内容)
如果您的类拥有指针,并且您的析构函数不是delete
指针,那么您可能会发生内存泄漏。使用诸如std::unique_ptr<>
之类的智能指针可以帮助避免这种情况。
答案 1 :(得分:0)
答案 2 :(得分:0)
我非常确定您正在寻找共享智能指针,例如shared_ptr
。
答案 3 :(得分:0)
使用默认赋值运算符分配该对象时会发生什么?
赋值运算符对为其定义的类的每个数据成员执行成员分配。这意味着如果在 p
类中有一些 X
指针,则赋值运算符只需将赋值给 X& X::operator=(const X& rhs) { // default-assignment operator
this->p = rhs.p;
return *this;
}
来自那个其他对象的指针。例如:
p
注意,因为如果delete
先前已分配了在分配之前未释放的内存,则上述内容可能会导致内存泄漏。如果您正在使用指针,则可能需要将其包装在std::unique_ptr<>
或std::shared_ptr<>
中,以便安全地删除内存。否则它将在分配后丢失。
此外,上面执行指针的浅副本。如果你想要一个深层拷贝,你可能需要覆盖这个方法并手动完成(或将指针包装在一个内部完成它的类中)。
如果我们在上述情况下使用删除一个对象会发生什么?
如果您nullptr
包含指针,但从未将其分配给其他对象,则您的类仍将处于有效状态,但指针的值将是不确定的。如果您曾使用指针,就好像它之后有一个值,您将在程序中调用Undefined Behavior。
最好在删除指针后为其指定值std::unique_ptr/std::shared_ptr
,这样您至少可以知道它没有指向有效对象(不要担心这一点同时使用{{1}}。另外,如果你的指针从另一个对象复制分配在语义上有意义,你应该这样做。