Почему передача объекта в качестве значения приводит к malloc: *** ошибка для объекта 0x100604c50: освобожденный указатель не был выделен - PullRequest
0 голосов
/ 22 декабря 2018

Я изучаю C ++, и у меня возникла проблема, причина которой я не знаю.Я создал класс векторов и матриц, которые являются легкими обертками вокруг массива C и управляют массивом T * в куче.

Класс Matrix имеет функцию:

// in NBDMatrix.hpp class definition
void makeXMeshgridv1(NBDVector<T> v){ // takes a value
    for(unsigned int j=0; j<ny; j++){
        for(unsigned int i=0; i<nx; i++)
            this->at(i,j) = v.at(i);
    }
}

void makeXMeshgridv2(NBDVector<T>& v){ // takes a reference
    for(unsigned int j=0; j<ny; j++){
        for(unsigned int i=0; i<nx; i++)
            this->at(i,j) = v.at(i);
    }
}

в основном()

NBDVector<float> vec1 = NBDVector<float>(0.0f, 12.6f, 4);
NBDVector<float> vec2 = NBDVector<float>(0.0f, 12.6f, 4);
NBDMatrix<float> mat1(4,8);
NBDMatrix<float> mat2(4,8);

mat1.makeXMeshgridv1(vec1); // causes problem at destruction
mat2.makeXMeshgridv2(vec2); // no problem at destruction

Если я использую makeXMeshgridv1 (), я получаю

 malloc: *** error for object 0x100604c50: pointer being freed was  not allocated at destruction

, но когда я использую makeXMeshgridv2, все идет хорошо.

Я хотел бы понять, что такоепроблема при использовании makeXMeshgridv1 ().

1 Ответ

0 голосов
/ 22 декабря 2018

Значение, переданное по значению, вероятно, не удаляется должным образом при выходе из области видимости

Как уже упоминали другие, вы должны следовать правилу 0/3/5.Правило 5 предназначено для оптимизации, поэтому вы можете сосредоточиться на правиле 0 и 3 на данный момент.

https://en.cppreference.com/w/cpp/language/rule_of_three Это пример ссылки на страницу.

rule_of_three(const char* s = "")
    : rule_of_three(s, std::strlen(s) + 1)
    {}
    ~rule_of_three()
    {
        delete[] cstring;  // deallocate
    }
    rule_of_three(const rule_of_three& other) // copy constructor
    : rule_of_three(other.cstring)
    {}
    rule_of_three& operator=(rule_of_three other) // copy assignment
    {
        std::swap(cstring, other.cstring);
        return *this;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...