2017-11-04 128 views
0

我想用其他对象的构造函数调用1对象的构造函数,并且在删除东西时遇到问题。代码的重要部分如下所示:将构造函数传递给函数C++而不调用delete

class command { 
public: 
    command(const string& s) { 
     x = (char*) calloc(s.size()+1, 1); 
     memcpy(x, s.c_str()); 
    } 
    ~command() { 
     free(x); 
    } 
private: 
    char* x; 
} 

此构造函数mallocs需要在析构函数中释放的char *。

class pair { 
public: 
    pair(command comm1in, command comm2in) 
    :comm1(comm1in), comm2(comm2in){}; 
private: 
    command comm1; 
    command comm2; 
} 

这一尝试的2场设置为发送的命令。 我想这也要求他们的拷贝构造函数(可能是错的)

在另一个函数

,我呼吁对构造像这样

pair p(command("something"), command("something else")); 

不幸的是,这有号召刚刚创造的价值的析构函数,然后在构造函数中对拷贝构造函数的影响。

有没有一种很好的方式来通过复制/删除过程初始化comm1和comm2? 我认为C++ 11有rValue引用和std :: move,但我不知道这些是否会在这里发挥作用。

+7

如果你在C++中,不使用malloc,使用新的std :: string。 – Aganju

+4

@Aganju是否正确,但如果您需要管理自己的资源,请确保遵循[三/五/零]规则(http://en.cppreference.com/w/cpp/language/) rule_of_three)。 –

+0

为什么不在'command'的构造函数和析构函数中设置一个断点?然后,您可以记下每种情况下正在创建和销毁的对象的地址,并查看它们是否匹配,以及每次调用的次数。这可能会让你对发生的事情有所了解。 – user1118321

回答

-5

所以我问了我的一位教授,然后玩了一下。 This非常有帮助。

这是上面的代码应该看起来像,如果我们要避免双释放指针x。 命令:

class command { 
public: 
    command(const string& s) { 
     x = (char*) calloc(s.size()+1, 1); 
     strcpy(x, s.c_str()); 
    } 
    command(command&& in): x(in.x) { 
     other.x = nullptr; 
    } 
    ~command() { 
     if(x) delete x; 
    } 
private: 
    char* x; 
} 

对:

class pair { 
public: 
    pair(command&& comm1in, command&& comm2in) 
    :comm1(std::move(comm1in)), comm2(std::move(comm2in)){}; 
private: 
    command comm1; 
    command comm2; 
} 

呼吁对的构造看起来是一样的

pair(command("something"), command("something else")); 

学习:

调用delete构造是不可避免的,所以我们反而必须定义一个移动构造函数给它的Rv命令alue的指针,并将R值的指针设置为null。 (所以当它的析构函数被调用时不释放仍然指向的内存)

为了让物体移动到另一个物体,用的std ::移动()

为什么这样做初始化它们?

  • 这允许我们确保只有那一个命令实例才会有对象。
  • 我们不必malloc /调用new并在堆上获取空间。
  • 时,对被删除的命令被自动删除,所以我们没有写一个删除功能
相关问题