堆上的C ++向量而不是堆栈

时间:2011-02-13 14:58:05

标签: c++ stack heap

我遇到了一个有趣的问题。我在C ++中有一个函数,它返回一个充满类的向量。返回向量后,它会为向量中元素的每个类调用deconstrustor。问题很明显,数据被破坏,其中类指向在销毁对象时释放的指针。我只能假设解调器被调用,因为vector不在堆栈上而不在堆栈上。

所以问题是:无论如何都要保持从函数返回向量而不被销毁?或者我是否必须传递指针返回向量作为函数的输入。

亚历

3 个答案:

答案 0 :(得分:4)

您可以使用new在堆上创建任何内容。您不应该从函数中给出对堆栈对象的引用,因为它们将在函数完成后立即销毁。

如果您希望函数以值返回向量,请确保向量内的对象实现复制构造函数(也可能是赋值运算符,不确定)。有了这个,请不要忘记Rule of Three

答案 1 :(得分:1)

C ++ 11应该使用右值引用来解决您的问题。老实说,我自己没有尝试过,但是根据我的阅读它会完全按照你要做的做,返回矢量而不会破坏并重新创建它(通过将该矢量分配的内存传递给新的矢量而不是让新的向量创建自己的内存并从旧的内容复制内容。)

答案 2 :(得分:0)

在堆上分配 。当您按值返回向量时,将使用所有元素的副本创建一个新向量,然后将销毁原始元素。

听起来你还没有正确定义你的拷贝构造函数。例如:

class ThisIsWrong
{
public:
    ThisIsWrong()
    {
        i = new int;
        *i = rand();
    }
    ~ThisIsWrong()
    {
        delete i;
        i = nullptr;
    }

    int value() const
    {
        return *i;
    }

private:
    int* i;
};

void foo()
{
    vector<ThisIsWrong> wronglets;
    wronglets.push_back(ThisIsWrong());
    return wronglets;
}

void main()
{
    vector<ThisIsWrong> w = foo();
    w[0].value(); // SEGFAULT!!
}

您需要删除复制和赋值构造函数(然后将其转换为编译错误而不是运行时),或者正确实现它们。