Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.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>和 HOO//COD>代码>房屋包含一个标准::列表_C++ - Fatal编程技术网

为什么在复制赋值期间调用析构函数? 我定义了以下两个C++结构,即代码>房间< /C>和 HOO//COD>代码>房屋包含一个标准::列表

为什么在复制赋值期间调用析构函数? 我定义了以下两个C++结构,即代码>房间< /C>和 HOO//COD>代码>房屋包含一个标准::列表,c++,C++,我使用new创建一个House对象。我用new创建了一个新的房间。我用new创建另一个House对象,并尝试将以前的House分配给这个对象。但是由于某种原因,房子析构函数被调用。。。为什么? (然后我还得到一个seg故障) 这是House::operator=方法返回值的析构函数。但是,您忘记了两个赋值运算符中的return语句(通常是return*this;),因此导致崩溃。当然,正如注释中所指出的,通常您也会返回一个引用,而不是副本。文件室副本构造函数从不初始化pString,然后将其删除

我使用
new
创建一个
House
对象。我用
new
创建了一个新的
房间。我用
new
创建另一个
House
对象,并尝试将以前的
House
分配给这个对象。但是由于某种原因,
房子
析构函数被调用。。。为什么?

(然后我还得到一个seg故障)


这是
House::operator=
方法返回值的析构函数。但是,您忘记了两个赋值运算符中的return语句(通常是
return*this;
),因此导致崩溃。当然,正如注释中所指出的,通常您也会返回一个引用,而不是副本。

文件室副本构造函数从不初始化
pString
,然后将其删除(空检查对未初始化的指针无效),随后会出现未定义的行为。您使用
new
这么多有什么特别的原因吗?本杰明,我最终会把一个
House
成员放在另一个类中,在某些时候,我希望能够用另一个
House
替换这个
House
成员。我认为指针在这里很有用(删除旧值)。有没有更好的方法…?从新房子分配到当前房子有什么问题吗?您不能
删除从
strdup
获得的指针。你应该
免费
它。更好的是,只需使用
std::string
,不必担心分配细节。另外,
operator=
返回
House&
Room&
也会更好。它返回对象的另一个副本没有任何意义。
struct Room
{
   Room()
   : pString(0)
   {
     std::cout << "Room ctor [" << std::hex << this << "]\n";
   }
   Room(const Room& other)
   {
     std::cout << "Room COPY ctor [" << std::hex << this << "] other: " << std::hex << &other << "]\n";
     if(other.pString)
     {
        if(pString)
            delete pString;
        pString = strdup(other.pString);
     }
   }
   Room operator=(const Room& other)
   {
     std::cout << "Room ASSIGNMENT operator [" << std::hex << this << "] other: " << std::hex << &other << "]\n";
     if(this != &other)
     {
         if(other.pString)
         {
            if(pString)
                delete pString;
            pString = strdup(other.pString);
         }
      }
   }

  ~Room()
   { 
     std::cout << "Room dtor [" << std::hex << this << "]\n";
     if(pString)
        delete pString;
   }
   char * pString;
};

/// House struct ////////////////////////////
struct House
{
   House()
   {
     std::cout << "House ctor [" << std::hex << this << "]\n";
   }
   House(const House& other)
   {
     std::cout << "House COPY ctor [" << std::hex << this << "] other: " << std::hex << &other << "]\n";
     roomlist = other.roomlist;
   }
   House operator=(const House& other)
   {
     std::cout << "House ASSIGNMENT ctor [" << std::hex << this << "] other: " << std::hex << &other << "]\n";
     if(this != &other)
     {
       roomlist = other.roomlist;
     }
   }

  ~House()
   { 
     std::cout << "House dtor [" << std::hex << this << "]\n";
   }
   std::list<Room> roomlist;
};
       House * pCurHouse = new House;          
       Room * pIkeaRm = new Room;
       pIkeaRm->pString = strdup("IKEA ROOM");
       std::cout << "Room created\n\n\n";
       pCurHouse->roomlist.push_back(*pIkeaRm);
       House * pOtherHouse = new House;       


       std::cout << "assigning current house to this house... \n";
       *pOtherHouse = *pCurHouse;
       std::cout << "House assigned. \n\n\n";
assigning current house to this house... 
House ASSIGNMENT operator [0x20753a0] other: 0x2075210]
Room COPY constructor [0x2075400] other: 0x2075310]
House destructor [0x7fff36a7a6a0]   //// which House object is that????
Room destructor [0x402580]
Segmentation fault (core dumped)