2013-11-10 4 views
0

Это мое определение класса и только конструктор копирования из более крупной программы. Когда мой деструктор выполнит, будет ли он автоматически освобождать память «coeff»? Я считаю, что, однако, моя программа выдает ошибку _CrtIsValidHeapPointer (pUserData) после завершения программы.Что происходит с новыми конструкторами классов?

class Poly 
{ 
private: 
int order; //order of the polynomial 
int size; //order + 1 
int * coeff;//pointer to array of coeff on the heap 

public: 
Poly(); 
Poly(int Order); 
Poly(int Order, int * Coeff); 
~Poly(){cout << "Destructor\n";}; 
Poly(const Poly &rhs); 

//accessors & mutators 
void set(); 
void set(int * Coeff, int Order); 
int getorder(){return order;}; 
int * get()const{return coeff;}; 

//Overloaded Operators 
Poly operator+(const Poly &rhs); 
Poly operator-(const Poly &rhs); 
Poly operator*(const int scale); 
Poly operator=(const Poly &rhs); 
Poly operator*(const Poly &rhs); 
const int& operator[](int I)const; 
int& operator[](int I); 
bool operator==(const Poly &rhs); 
int operator()(int X); 
friend ostream & operator<<(ostream & Out, const Poly &rhs); 
friend istream & operator >>(istream & In, Poly &rhs); 
}; 

Poly::Poly(const Poly &rhs) 
{ 
order = rhs.order; 
size = rhs.size; 
int *coeff = new int[size]; 
for(int i(0); i <= order; i++) 
    coeff[i] = rhs.coeff[i]; 
} 

Благодаря

+1

Нет, ваш деструктор ничего не выпускает. – juanchopanza

ответ

0

Деструктор будет делать как ваш код, не более того. Ваш деструктор просто печатает сообщение. Попробуйте под кодом:

~Poly() { 
    delete [] coeff; // if you allocated memory by new in constructor! 
} 

Как подсказка, постарайтесь не использовать голые указатели. Всегда есть std::vector, std::unique_ptr, ...

+0

Я тоже попытался это сделать, и новая ошибка «crt обнаружила, что приложение записано в память после окончания кучного буфера». Я предполагаю, что я могу использовать слишком много «новых» заявлений. К сожалению, нам не разрешено использовать любые STL (т. Е. Векторы и т. Д.). Моя программа работает, и это хорошо. – TriHard8

1

деструктор будет только cout << "Destructor\n". Он не освободит память.

1

Деструктор заботится о любой памяти, которую автоматически выделяет конструктор, и ничего больше не будет делать. Поэтому, если вы выделили память самостоятельно (например, когда вы использовали new), деструктор оставит ее. Если он будет вести себя по-другому, он может уничтожить данные, которые вы используете, в другом месте программы. Вот почему он не делает delete для переменных, которые вы создали с помощью new или new[].

Проверьте документацию IDE, поскольку он может иметь механизм очистки, который очищает все данные после завершения работы программы и может автоматически вставлять этот механизм в ваш выходной код.

Смежные вопросы