Ошибка проверки во время выполнения №2 - Стек вокруг переменной 'e' был поврежден. произошло - PullRequest
0 голосов
/ 30 мая 2020
    #include<iostream> 
    #include <list> 
    using namespace std;

class Euler {
private:
    int korifes = 0;
    int akmes = 0;
    int* pinakas[];
public:
    void print() { cout << *pinakas[0]; return; }

    Euler(int korifess, int akmess);
    ~Euler() { delete[] *pinakas; }

    void addAkmes(int kor1, int kor2);
};

Euler::Euler(int korifess, int akmess) : akmes(akmess), korifes(korifess) {
    *pinakas = new int(korifes);
    *pinakas[0] = 89;
}

int main() {
    Euler e(2, 1);
    e.print();
}

Ошибка проверки во время выполнения № 2 - Стек вокруг переменной 'e' был поврежден. произошло ... не могу найти ошибку в коде.

1 Ответ

1 голос
/ 30 мая 2020

В вашем коде есть ряд ошибок, все из которых связаны с природой переменной-члена pinakas. В его нынешнем виде вы объявляете это как массив указателей (на int), и, кроме того, вы используете нестандартный синтаксис для «гибких» массивов (пустой []).

Обычно я не просто вставляю «фиксированный» код в качестве ответа, но в этом случае этот код (с добавленными \\\ комментариями, в которые я внес изменения), вероятно, будет наиболее кратким способом помочь вам.

Хотя, как многие здесь, без сомнения, отметят, гораздо лучше избегать использования «сырых» указателей и операторов new и delete, и используйте вместо него контейнер std::vector.

#include <iostream> 
#include <list> 
//using namespace std;/// This is considered 'bad practice' by many programmers
using std::cout;/// Just use the aspect of the STL that you need!

class Euler {
private:
    int korifes = 0;
    int akmes = 0;
    int* pinakas;/// This will point an 'array' of integers
public:
    void print() {
        cout << pinakas[0]; return;/// No longer any need for the dereference (*)
    }
    Euler(int korifess, int akmess);
    ~Euler() {
        delete[] pinakas;/// No need for the dereference (*)
    }
//  void addAkmes(int kor1, int kor2);/// You haven't provided an actual definition for this, but your never use it!
};

Euler::Euler(int korifess, int akmess) : akmes(akmess), korifes(korifess)/// NOTE: Members are initialized in DECLARATION order!
{
    pinakas = new int[korifes];/// Use "[]" (not "()") to allocate an array!
    pinakas[0] = 89;/// No need for the dereference (*)
}

Не стесняйтесь обращаться за любыми дополнительными разъяснениями и / или объяснениями.

...