繁体   English   中英

我无法让析构函数在我的代码中工作

[英]I cant get my destructor to work in my code

就像我在标题中说的那样,我无法让析构函数工作。 原因是,在此程序中,我需要使用带有负索引的int *数组:在运行时,我总是在随机时间出现此错误:Microsoft C ++异常:内存位置0x009DF130的std :: bad_alloc。 我认为这是涉及错误的代码:

private: int* run;
IntArray::IntArray(int a, int b)
{
    int c = b-a;
    run = new int [c] + a; //This is how i give it a negative indicie
    h = b;
    l = a;
}
IntArray::~IntArray()
{
    delete[]run;
}
string IntArray::setName(string sp)
{
    s = sp;
    return s;
}
void runSim() {
    IntArray b(-4, 6);
    for (int i = b.low(); i <= b.high(); i++)
    // low is the lowes bound high  is the highest
        b[i] = i * 10;
    b.setName("b"); //this is where it breaks and gives me that error
    wait();
}

唯一正确的方法是在类上定义一个自定义operator[] 您的代码有很多错误:

  1. 您同时访问lowhigh ,即high-low+1元素。 但是您只分配high-low
  2. 如果p=new int[high-low+1] ,则run=p+low; 并且run[low]表示*(p + low + low) 这是导致崩溃的最直接原因-您在数组之外进行了编写,浪费了内部元数据,这使下一个用户(字符串的赋值运算符)的动态分配失败。
  3. 您应该在计算run时减去low ,以便run[low]会给p[0] (第一个分配的元素)。 但这可能会在数组外部(当low为正时)计算指针,这是未定义的行为。
  4. 您传递的指针不是来自new数组的delete[] 您需要传递p而不是rundelete[]
  5. 您没有尝试异常安全。 C ++中的动态内存管理是一个高级主题,证据表明您还不准备这样做。 因此,请使用现有的智能指针来管理您的内存。

这是一个更好的版本:

#include <memory>

template<typename T>
class ArbBoundArray
{
    int low;
    std::unique_ptr<T[]> base;

public:
     ArbBoundArray(int l, int h) : low(l), base(new T[h-l+1]) {}
     T& operator[](int o) { return base[o-low]; }
     const T& operator[](int o) const { return base[o-low]; }
};

而已。 更少的代码,不仅适用于int ,而且适用于任何类型,并且适用于异常安全。

您可以在基本概念的基础上添加名称或其他特殊要求。

您有一个简单的错误:

不要传递一个值来delete []不是从new [] (或已经传递一次)中delete []

您需要撤消指针算法以获取正确的指针。

另外,请注意,如果使用指针算术创建指向数组外部的指针,则将具有未定义行为。

如果这不是您的实际代码,请当心不要分配少于1个元素。

既然你添加a (又名l )来run ,当你new ,你必须在你减去delete它:

delete[] (run - l);

并不是要刻薄,但这是非常糟糕的代码。

首先,如果b - a返回小于0的数字,则可能会得到std::bad_alloc ;如果a > c您将进入未定义的行为 [可怕]领域,如果尝试使用,可能会出现段错误指针。

似乎您似乎试图delete[]指向new int[c] + a的指针,您几乎肯定会遇到段错误。

您需要先run -= a然后再尝试delete[]它,该实现将在您获得的指针之前的空间中存储有关任何newmalloc信息,以便在deletefree内存时,它只需要在指针后面运行并获取所需的任何信息,或将信息存储在由指针的数字表示形式索引的隐藏数组中。 但可能是第一个。 无论哪种方式,您都在做自己在做的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM