【问题标题】:Returning instance of a class causes Invalid address error [duplicate]返回类的实例导致无效地址错误[重复]
【发布时间】:2019-04-16 16:47:59
【问题描述】:

我有一个类,用于表示具有未指定维数的向量 VectorN:

int Size = 0;

VectorN::VectorN(int L)
{
    Size = L;
    Dimentions = new double[L];
}

VectorN::~VectorN()
{
    delete[] Dimentions;
}

VectorN VectorN::operator+(const VectorN &rhs)
{
    VectorN r = VectorN(this->Size);
    for (int i = 0; i < Size; i++)
    {
        r[i] = Dimentions[i] + rhs.Dimentions[i];
    }
    return r;
}

double& VectorN::operator[](int arg)
{
    return Dimentions[arg];
}

这在我的主要功能中使用:

VectorN test = VectorN(1);
test[0] = 1;

VectorN test2 = VectorN(1);
test2[0] = 1;


VectorN test3 = VectorN(1);
test3 = test + test2;

但是,在最后一行之后,程序会遇到“断点”,并显示消息“指定给 RtlValidateHeap 的地址无效”

我认为正在发生的是这条线

test3 = test + test2;

通过创建 VectorN 的临时实例导致问题

test + test2

然后将其复制到 test3 中,然后删除临时版本,因为它超出了 add 函数的范围,但是由于它仍在 test3 中被引用,编译器出现问题,因为它试图删除一个仍在存在的变量跟踪。 (请谨慎对待,我不是 C++ 专家,所以这可能是完全错误的。)

我想我可以通过简单地传递一个指向在重载加法函数中创建的对象的指针来解决这个问题,但是我宁愿不冒内存泄漏的风险,因为每次我对类使用加法时都必须手动删除创建的实例。

【问题讨论】:

  • 如果您将std::unique_ptr&lt;double[]&gt;std::vector&lt;double&gt; 用于Dimensions 而不是原始指针,则会为自己省去很多麻烦。

标签: c++


【解决方案1】:

我认为问题可能是复制分配特殊功能。 如果你写析构函数,你还必须写其他特殊函数,这就是三大定律(实际上是现代cpp中的大五)。 您可以在此链接中找到更多解释:What is The Rule of Three?

【讨论】:

  • 这正是我想要的,谢谢!
猜你喜欢
  • 2013-08-29
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 2019-01-25
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
相关资源
最近更新 更多