2016-06-04 2 views
0

я не мог найти свой ответ с таким прибегая к помощи им просят здесь: Предположим, что у нас есть такой код, и мы не хотим перегружать конструктор копированияСколько утечек памяти у нас есть?

#ifndef ARRAY_H 
#define ARRAY_H 

class Array { 
     public: 
     Array(int = 10); 

     int* ptr; 
     int size; 
       } 
#endif // ARRAY_H 

и мы имеем:

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

Array::Array(int A) 
{ 
    size = (A > 0) ? A : 10; 
    ptr = new int[size]; 

    for(int i=0; i<size; i++) 
    { ptr[i] = i;} 
} 

и основной() является:

Array newArray1(10); 
    Array newArray2(8); 
    newArray2 = newArray1; 

теперь наш профессор сказал, что мы должны болтаться здесь проблемы, потому что мы имеем тот же адрес для обоих новыйArray1 и новыйArray2
мой вопрос есть если мы удалим новыйArray1 память: есть ли мы утечка памяти кроме болтаться ??? что случилось с памятью ptr newArray2, которую ptr указывал на нее, прежде чем получить адрес newArray1 ??? эта часть памяти существует сейчас ??? и у нас есть другие проблемы с утечкой памяти ???

+1

Помимо того факта, что вы никогда не вызываете delete [], вы также делаете мелкую копию, так что да, есть много проблем с этим кодом. Чтобы узнать, сколько у вас утечек памяти, подсчитайте количество вызовов (x = new [] - delete []). Таким образом, предполагая, что int составляет 4 байта, 72 байта никогда не очищались. –

+0

благодарит Dr.jones за его хорошую формулу !!! – Arian

+0

Dr.jones, кажется, мой вопрос не был достаточно прямым, я спросил о памяти newArray2 (8), я отредактировал свой вопрос, но спасибо, ответите мне, что я хотел – Arian

ответ

0

Чтобы ответить на ваш вопрос: у вас нет деструктора delete[] в памяти, которую вы выделяете ptr в конструкторе. Так что да, у вас есть утечка.

Лучшим вариантом было бы просто использовать std::unique_ptr вместо ручного управления памятью.

Кроме того, почему вы не используете список инициализации конструкторов, а вместо этого назначаете членам в тело конструктора?

+0

Jesper Juhl да, вы правы, это не стандартный код, и у него много ошибок, потому что он не используется в реальном проекте. Я просто хотел узнать, что произойдет, если мы не будем использовать перегрузку конструктора. – Arian

+0

@Arian Если вы согласны с тем, что я прав, вы должны принять ответ, а не оставлять комментарий;) –

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