Как устранить ошибку (имя проекта вызвало точку останова)? - PullRequest
0 голосов
/ 30 октября 2019

После запуска программы появляется сообщение о том, что имя проекта вызвало точку останова. Я до сих пор не знаю, в чем ошибка. Я думаю, что отсутствует функция-член, но кто-то помог мне?

#include "AClass.h"
#include <iostream>

using namespace std;

int main()
{
    AClass* x = new AClass(10, -1.0);
    AClass y = *x;
    delete x;
    return 0;
}

Код из моего файла cpp выглядит следующим образом:

#include "AClass.h"
#include <iostream>
using namespace std;

// Constructor
AClass::AClass(int len, double val)
    : length(len)
{
    if (len < 0) {
        cout << "Invalid data length = " << len << endl;
        data = NULL;
    }

    else {
        data = new double[length];
        for (int i = 0; i < length; i++)
            data[i] = val;
    }
}

// Destructor
AClass::~AClass()
{
    // delete data if it is not NULL
    if (data) delete[] data;
}

1 Ответ

3 голосов
/ 30 октября 2019

Ваш AClass член double* data; будет скопирован сюда:

AClass y = *x;

Поскольку вы не предоставили конструкторы / операторы копирования / перемещения, необработанный указатель будетв этих ситуациях копируется как есть , а delete[] data будет выполняться как x, так и y в деструкторе.

Обязательное чтение при работе с необработанными указателями: https://en.cppreference.com/w/cpp/language/rule_of_three

И эти:
Что такое правило трех?
Правило трех становится правилом пяти с C ++ 11?

Вот пример реализации функций-членов, упомянутых в приведенных выше статьях. Это немного - и подвержено ошибкам, поэтому почти всегда лучше использовать стандартный контейнер.

#include <algorithm>
#include <iostream>
#include <utility>

class AClass {
public:
    AClass(size_t len, double val);

    // rule of five:
    AClass(const AClass& rhs);            // copy constructor
    AClass(AClass&& rhs);                 // move constructor
    AClass& operator=(const AClass& rhs); // copy assignment
    AClass& operator=(AClass&& rhs);      // move assignment
    ~AClass();

private:
    size_t length; // use an unsigned type since you only accept unsigned values
    double* data;
};

// destructor
AClass::~AClass() {
    delete[] data;
}

AClass::AClass(size_t len, double val) : 
    length(len),
    data(new double[length])
{
    std::fill_n(data, length, val);
}

// copy constructor
AClass::AClass(const AClass& rhs) :
    length(rhs.length),
    data(new double[length])
{
    std::copy_n(rhs.data, length, data);
}

// move constructor
AClass::AClass(AClass&& rhs) :
    length(std::exchange(rhs.length, 0)),
    data(std::exchange(rhs.data, nullptr))
{}

// copy assignment
AClass& AClass::operator=(const AClass& rhs) {
    double* tmpdata = new double[rhs.length];
    delete[] data;
    length = rhs.length;
    data = tmpdata;
    std::copy_n(rhs.data, length, data);
    return *this;
}

// move assignment
AClass& AClass::operator=(AClass&& rhs) {
    // leave the destruction up to the moved-from object
    std::swap(length, rhs.length);
    std::swap(data, rhs.data);
    return *this;
}

int main() {
    AClass* x = new AClass(10, -1.0);
    AClass y = *x;
    delete x;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...