Как создать vector объектов класса с динамическим выделением памяти в классе?
Необходимо считывать матрицы из файлов. Матрицы считываеются правильно, проблема в том, чтобы запихнуть обьекты класса в vector. При отладке выдает "...нарушение прав доступа при чтении по адресу..." в файле delete_scalar.cpp. Еще заметил, что при считывании каждого нового файла для предыдущего элемента vector вызывается деструктор
//main.cpp
#include "SLAE.h"
const std::vector<std::string> fileNames = { "file1.txt", "file2.txt", "file3.txt" };
int main()
{
std::vector<SLAE> tests;
for (const auto& f : fileNames)
tests.emplace_back(f);
}
//SLAE.h
#include<iostream>
#include<fstream>
#include <vector>
#include <string>
class SLAE
{
private:
double** array;
int arraySize;
public:
SLAE();
SLAE(const std::string&);
~SLAE();
};
//SLAE.cpp
#include "SLAE.h"
SLAE::SLAE(){}
SLAE::SLAE(const std::string& file)
{
std::ifstream readStream(file);
readStream >> arraySize;
//Выделение памяти
array = new double*[arraySize];
for (int i = 0; i < arraySize; i++)
array[i] = new double[arraySize+1];
//Чтение из файла
}
SLAE::~SLAE()
{
for (int i = 0; i < arraySize; i++)
{
delete[](array[i]);
}
delete[](array);
}
Ответы (1 шт):
У вас нет копирующего конструктора, поэтому при вставке в вектор выполняется генерируемое поверхностное копирование (копирование указателя, а не памяти), соответственно, получается повторное удаление (освобождение) уже освобожденной памяти, отсюда и проблемы.
Напишите корректный копирующий конструктор.
Да и в конструкторе по умолчанию хотя бы занулите указатель - с соответствующей проверкой в деструкторе (если нулевой указатель - то цикл удалений не выполнять).