2010-12-22 151 views
0

我想了解这个复制构造函数问题。在程序退出后,我遇到了与析构函数有关的问题。看来可变char *标题没有被破坏,我想这可能是错误的,谢谢复制构造函数问题

另一个问题是为什么当对象x等于x2时不会调用赋值运算符。我使用g ++和codeblocks。

#include <iostream> 

using namespace std; 

class myClass 
{ 
    private: 

     int x; 
     int *p; 
     char* title; 

    public: 

     myClass(int tx, int* temp, char* newtitle) 
     { 
      x = tx; 
      cout << "int constructor called with value x = " << x << endl; 

      p = new int; 
      p = temp; 

      title = new char [strlen(newtitle)+1]; 
      strcpy(title, newtitle); 
     } 
     myClass(const myClass& mc) 
     { 
      cout << "copy constructor called with value = " << mc.x << endl; 
      x = mc.x; 
      p = new int; 
      *p = *mc.p; 

      title = new char [strlen(mc.title)+1]; 
      strcpy(title, mc.title); 
     } 
     myClass & operator = (const myClass & that) 
     { 
      cout << "assignment called" << endl; 

      if(this != &that) 
      { 
       x = that.x; 
      } 
      return *this; 
     } 
     ~myClass() 
     { 
      if (p) 
      { 
       cout<<"deleting p"<<endl; 
       delete p; 
      } 
      else if(title) 
      { 
       cout<<"deleting title"<<endl; 
       delete[] title; 
      } 
     } 
}; 

int main() 
{ 
    int pointee = 10; 
    int* p = &pointee; 
    myClass x(3,p,"hello"); 
    //myClass y = myClass(3,p); 
    myClass x2 = x; 
    return 0; 
} 
+0

修复了您的格式。 – 2010-12-22 17:13:52

+3

也许你需要在析构函数中使用“if(title)”而不是“else if(title)” – DReJ 2010-12-22 17:15:37

回答

3

您在我的实际代码和一般方法中都能看到各种各样的问题。

首先,char * title不会被删除,因为您不会删除它。这可能是一个逻辑错误:

if (p) 
    { 
     cout<<"deleting p"<<endl; 
     delete p; 
    } 
    else if(title) 
    { 
     cout<<"deleting title"<<endl; 
     delete[] title; 
    } 

您可能不需要else。你为什么把它放在那里?

接下来,你都渗出了int,在这里:

p = new int; 
    p = temp; 

int你只是new -ed得到由传入的价值temp覆盖。

后来,您尝试在析构函数中删除此指针。但是因为你正在删除一个指向自动变量的指针,所以你会把这个堆放到一个地方。这也是一个逻辑错误。解决方案:不要这样做:p = temp;

然而,最终,您的方法在多个层面上是有问题的。

  1. 为什么你首先动态分配int?只需要有一个int班的成员。不要使用动态分配(例如newdelete),除非你真的必须。
  2. 请勿使用char* s动态分配字符串。相反,使用std::string#include <string>
  3. 如果你确实是需要动态分配,请不要使用原始指针。改用智能指针。 C++自带一个内置的std::auto_ptr#include <memory.h>,但在其他库中有许多其他选项,通常是更好的选择。这里颇受欢迎的是Boost的智能指针。
1

你的析构函数删除p如果p是非NULL;如果它不是NULL,则它删除titlep为NULL

但是你的构造函数和拷贝构造函数都会一直创建new pnew title。所以你需要一直检查和删除。

0

尝试

*p = *temp; 

代替

p = temp; 

,并在析构函数

if(title) 

,而不是

else if(title)