Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用默认赋值运算符的指针对象_C++ - Fatal编程技术网

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

C++ 使用默认赋值运算符的指针对象,c++,C++,假设一个对象有一个指针类型作为其数据成员 当我们使用默认赋值运算符指定该对象时会发生什么? 如果在上述情况下使用delete一个对象,会发生什么情况? 指针被复制 没有什么该对象将被删除,而另一个对象将保持不变。 指针是复制分配的,正如您所期望的那样,默认行为是以成员方式复制/移动分配所有内容 如果类拥有指针对象,而析构函数没有删除指针,那么可能会发生内存泄漏。使用诸如std::unique\u ptr之类的智能指针有助于避免这种情况 指针只是简单地复制,根本不接触指针对象 指针对象不受影响,其

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

当我们使用默认赋值运算符指定该对象时会发生什么? 如果在上述情况下使用delete一个对象,会发生什么情况? 指针被复制 没有什么该对象将被删除,而另一个对象将保持不变。 指针是复制分配的,正如您所期望的那样,默认行为是以成员方式复制/移动分配所有内容

如果类拥有指针对象,而析构函数没有删除指针,那么可能会发生内存泄漏。使用诸如std::unique\u ptr之类的智能指针有助于避免这种情况

指针只是简单地复制,根本不接触指针对象 指针对象不受影响,其内存不会被释放编辑:当然,除非析构函数对其进行处理。。。 我很确定您正在寻找共享智能指针,例如

当我们使用默认赋值运算符指定该对象时会发生什么

赋值运算符对为其定义的类的每个数据成员执行成员式赋值。这意味着,如果类X中有某个指针p,赋值操作符将简单地将其赋值给来自另一个对象的指针。例如:

X& X::operator=(const X& rhs) { // default-assignment operator
    this->p = rhs.p;
    return *this;
}
请注意,如果p之前分配了未在分配前解除分配的内存,则上述情况可能会导致内存泄漏。如果您使用的是指针,您可能希望将其包装在or中,这样可以安全地删除内存。否则,它将在任务完成后丢失

此外,上面的命令执行指针的浅拷贝。如果需要深度复制,可能需要重写此方法并手动执行,或者将指针包装到内部执行此操作的类中

如果在上述情况下使用delete一个对象,会发生什么情况

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

在删除指针后,最好给它一个null ptr值,这样您至少可以知道它没有指向有效的对象。在使用std::unique\u ptr/std::shared\u ptr时,不要担心这一点。另外,如果从语义上讲,从另一个对象复制分配指针是有意义的,那么应该这样做


默认的复制ctor/op=进行成员级复制。指针是一种简单的基本数据类型,它只是被复制。默认dtor调用所有成员、基类或成员的dtor。对于非类类型,这不起任何作用。2如果对象O的析构函数确实删除了m_指针,而您没有编写深度复制副本构造函数,则O的所有剩余副本在任何副本被销毁后都将包含通配符。拥有指针数据类型并不意味着指向的对象分配了新的,或者它属于包装公司object@pqnet,这就是为什么我使用if`s,告诉我如果它不清楚,问题就不清楚了。删除对象时会发生很多事情。。。