指针对象使用默认赋值运算符

时间:2014-08-22 19:43:39

标签: c++

假设一个对象有一个指针类型作为其数据成员。

  1. 使用默认赋值运算符分配该对象时会发生什么?
  2. 如果我们在上述情况下使用删除一个对象会发生什么?

4 个答案:

答案 0 :(得分:2)

  1. 指针是复制分配的,正如您所期望的那样(默认行为是成员复制/移动分配所有内容)

  2. 如果您的类拥有指针,并且您的析构函数不是delete指针,那么您可能会发生内存泄漏。使用诸如std::unique_ptr<>之类的智能指针可以帮助避免这种情况。

答案 1 :(得分:0)

  1. 指针已复制
  2. 无。该对象被删除,另一个对象不变。

答案 2 :(得分:0)

  1. 只需简单地复制指针,而无需触及所有
  2. 指针
  3. Pointee不受影响,其内存未被释放编辑:除非析构函数对此有所帮助......
  4. 我非常确定您正在寻找共享智能指针,例如shared_ptr

答案 3 :(得分:0)

  1. 使用默认赋值运算符分配该对象时会发生什么?

    • 赋值运算符对为其定义的类的每个数据成员执行成员分配。这意味着如果在 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<>中,以便安全地删除内存。否则它将在分配后丢失。

      此外,上面执行指针的副本。如果你想要一个深层拷贝,你可能需要覆盖这个方法并手动完成(或将指针包装在一个内部完成它的类中)。

  2. 如果我们在上述情况下使用删除一个对象会发生什么?

    • 如果您nullptr包含指针,但从未将其分配给其他对象,则您的类仍将处于有效状态,但指针的值将是不确定的。如果您曾使用指针,就好像它之后有一个值,您将在程序中调用Undefined Behavior

      最好在删除指针后为其指定值std::unique_ptr/std::shared_ptr,这样您至少可以知道它没有指向有效对象(不要担心这一点同时使用{{1}}。另外,如果你的指针从另一个对象复制分配在语义上有意义,你应该这样做。

相关问题