#include <iostream>
#include <fstream>
#include <initializer_list>
#include <memory>
class OutOfMem { };
class IndexOutOfRange { };
class NoFile { };
class InvalidFileFormat { };
class WrongDim { };
class Array {
public:
Array(double * arr, const unsigned c) : array(arr), columns(c) { }
double &operator [] (const unsigned i)
{
if(i >= columns)
throw IndexOutOfRange();
return array[i];
}
private:
double * array = nullptr;
unsigned columns;
};
class 2DArray {
public:
2DArray(std::fstream &is)
{
if(!is)
throw NoFile();
if(!(is >> rows >> columns))
throw InvalidFileFormat();
matrix = new (std::nothrow) double *[rows];
if(!matrix)
throw OutOfMem();
use = new (std::nothrow) std::size_t(1);
if(!use)
throw OutOfMem();
for(unsigned i = 0; i < rows; i++)
{
matrix[i] = new(std::nothrow) double[columns];
if(!matrix[i])
throw OutOfMem();
}
for(unsigned i = 0; i < rows; i++)
for(unsigned j = 0; j < columns; j++)
{
double temp;
if(!(is >> temp))
throw WrongDim();
matrix[i][j] = temp;
}
}
~2DArray()
{
if(--*use == 0)
{
for(unsigned i = 0; i < rows; i++)
delete [] matrix[i];
delete [] matrix;
delete use;
}
}
Array operator [] (const unsigned i)
{
if(i >= rows)
throw IndexOutOfRange();
if(*use == 1)
return Array(matrix[i], columns);
else
{
double ** copy;
copy = new (std::nothrow) double *[rows];
for(unsigned i = 0 ; i < rows; i++)
{
copy[i] = new (std::nothrow) double[columns]();
if(!copy[i])
throw OutOfMem();
for(unsigned j = 0 ; j < columns; j++)
copy[i][j] = matrix[i][j];
}
--*use;
matrix = copy;
use = new std::size_t(1);
return Array(matrix[i], columns);
}
}
private:
unsigned rows;
unsigned columns;
double ** matrix = nullptr;
std::size_t * use;
};
파일에서 행렬을 읽는 데 사용되는 프로그램에서 문제가 발생하지만 잘못된 값을 추가하여 파일을 다시 포맷 할 때 메모리 누수가 발생합니다. 소멸자를 호출해야하지만 던져진 후에도 오브젝트가 남아있는 경우가 거의 없습니다. 모든 팁 ?? 메모리 검사를 위해 valgrind를 사용하고 있습니다.예외를 throw 한 후 메모리 누수
['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector)는 친구입니다. 'new'와'delete'는 적입니다. –
@CaptainObvlious 알아. 보통 나는 거의 새로운 것을 사용하지 않고 삭제합니다. 하지만 그건 임무를위한 것이었고 나는 컨테이너를 사용하지 말라는 의무가있었습니다. – user3119781
생성자는'istream'을 사용하여 입력 스트림을 가져올 수 있습니다. –