c++ - 检测到堆损坏 : private array

标签 c++ arrays destructor heap-corruption

所以我必须用一个 Point 类来编写一个程序,它需要有多少个维度,然后我在该类中创建了一个需要如此多坐标的函数,为此,我必须创建一个动态数组,因为大小不固定。

class Punkt
{
private:
    char n;
    int d;
    double* k = new double[d];
public:
    Punkt(int);
    void Name(char);
    void Initialisieren();
    ~Punkt();
};

这是定义这些函数的地方:

Punkt::Punkt(int dimension)
{
    d = dimension;
}

void Punkt::Name(char name)
{
    n = name;
}

void Punkt::Initialisieren()
{
    for (int i = 0; i < d; i++) {
        cout << "Geben sie bitte die " << i + 1 << ". Koordinate von " << n << " ein: ";
        cin >> k[i];
        cout << endl;
    }
}

Punkt::~Punkt()
{
    cout << "Destrukt: " << n << endl;
    delete[] k;
}

启动程序时,我收到消息 Destrukt: B,但 Destrukt: A 丢失(我首先声明 A,然后声明 B),然后它给了我错误。它也不会执行我告诉它与我所做的一些其他功能相关的任何操作,但没有将它们列出来。有人可以帮帮我吗?我知道这个问题已经被问过很多次了,但大多数人都遇到了问题,因为他们制作了一个字符数组,却忘记了最后一个包含零的位置。

附注该程序是用德语编写的,如果需要更改,请告诉我,因为我是这部分的新手。

最佳答案

请注意,类定义中有以下内容:

int d;
double* k = new double[d];

这将在构造函数运行到大小为 d 的新数组之前初始化 k。问题是此时 d 尚未初始化,因为构造函数尚未运行。要解决此问题,请将初始化移至构造函数中。

您还需要一个复制构造函数和赋值运算符,以及可选的移动构造函数和移动赋值运算符。如果您还没有听说过这些术语,请在线快速进行 Google 搜索。

关于c++ - 检测到堆损坏 : private array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34475715/

相关文章:

c++ - 如果派生类析构函数抛出异常,基类析构函数会发生什么

python - 根据给定索引交换两个列表的值

python - 分辨率列表(OpenCv、Python、相机)

c++ - 模板基类继承是否有另一种解决方法?

c++ - 删除 vector 中的指针时出错

c - c中的数组和字符串

c# - 静态实例,从未调用析构函数

c++ - 为什么调用析构函数?

c++ - 数组类型的元素类型不完整,无法进行模式匹配

c++ - boost 不可复制的怪异性