将构造函数传递给函数c ++而不调用delete

时间:2017-11-04 03:03:14

标签: c++ c++11

我正在尝试使用其他对象的构造函数调用1个对象的构造函数,并且遇到删除问题。代码的重要部分如下所示:

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但我不知道这些是否会在这里发挥作用。

1 个答案:

答案 0 :(得分:-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的构造函数看起来是一样的

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

学习:

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

要允许将对象移动到另一个对象中,请使用std :: move()

初始化它们

为什么这样?

  • 这允许我们确保只有那1个命令实例才能拥有该对象。
  • 我们不必对malloc /调用new并在堆上获取空间。
  • 删除对时会自动删除该命令,因此我们不必编写删除功能