Как создать утечку памяти в C ++? - PullRequest
20 голосов
/ 30 августа 2011

Мне было просто интересно, как можно создать утечку системной памяти с помощью C ++. Я немного погуглил по этому вопросу, но не особо придумал, я знаю, что на самом деле это неосуществимо в C #, поскольку это управляемый код, но мне было интересно, существует ли простой способ сделать это с C ++? Я просто подумал, что было бы интересно посмотреть, насколько сильно страдает система из-за того, что код написан неправильно. Спасибо.

Ответы [ 9 ]

25 голосов
/ 30 августа 2011

Утечка памяти происходит при вызове new без вызова соответствующего delete позже.Как показано в этом примере кода:

int main() {
    // OK
    int * p = new int;
    delete p; 

    // Memory leak
    int * q = new int;
    // no delete
}
25 голосов
/ 30 августа 2011
  1. Создать указатель на объект и выделить его в куче
  2. Не удалять его.
  3. Повторить предыдущие шаги
  4. ????
  5. Прибыль
13 голосов
/ 30 августа 2011
int main() {
    while(true) new int;
}
7 голосов
/ 30 августа 2011

Существует много видов утечек памяти:

  • Выделенная память, которая не может быть освобождена, потому что на это ничего не указывает.
    Подобные утечки легко создавать в C и C ++.Их также довольно легко предотвратить, легко обнаружить и легко вылечить.Поскольку их легко обнаружить, существует множество бесплатных и коммерческих инструментов, помогающих найти такие утечки.

  • Все еще доступная выделенная память, которая должна была быть выпущена давно.
    Такие утечки намного сложнее обнаружить, предотвратить или устранить.Что-то еще указывает на это, и оно будет выпущено , в конечном итоге - например, прямо перед exit().Технически говоря, это не совсем утечка, но для всех практических целей это утечка.Многие предположительно без утечек приложений имеют такие утечки.Все, что вам нужно сделать, это запустить системный профиль, чтобы увидеть, как какое-то глупое приложение потребляет все больше памяти.Подобные утечки легко создавать даже на управляемых языках.

  • Выделенная память, которая никогда не должна была выделяться в первую очередь.
    Пример: пользователь может легко попросить Matlabсоздавая такие утечки.Matlab также довольно агрессивен в создании подобных утечек.Когда Matlab получает ошибку из malloc, он входит в цикл, где он ждет немного, а затем повторяет попытку malloc.Тем временем ОС отчаянно пытается справиться с потерей памяти, перетаскивая куски программ из реальной памяти в виртуальную память.В конце концов все находится в виртуальной памяти - и все замирает.

5 голосов
/ 30 августа 2011

Я нашел эту статью полезной для стресс-тестирования - она ​​также поставляется с примерами кода.

3 голосов
/ 30 августа 2011

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

2 голосов
/ 20 июня 2017
class ClassWithLeakedMemory{
private:
    char* str;
public:
    ClassWithLeakedMemory(){
        str = new char[100];
    }

    ~ClassWithLeakedMemory(){
        cout<<"We are not freeing the dynamically allocated string memory"<<endl;
    }

};


class ClassWithNoLeakedMemory{
private:
    char* str;
public:
    ClassWithNoLeakedMemory(){
        str = new char[100];
    }

    ~ClassWithNoLeakedMemory(){
        cout<<"We are freeing the dynamically allocated string memory"<<endl;
        delete[] str;
        str = null;

    }

};

int main() {
    //we are creating an automatic object of the ClassWithleakedMemory
    //when we will come out of the main, this object will be
    //out of scope. hence it will be deleted. so destructor will
    //be called. but in the destructor, we have not specifically
    //deleted the dynamically allocated string.

    //so the stack based pointer object str will be deleted but the   memory  
    //it was pointing to won't be deleted. so we will be left with an
    //unreferenced memory. that is memory leak.
    ClassWithLeakedMemory objectWithLeakedmemory;
    ClassWithNoLeakedMemory objectWithNoLeakedmemory;
    return 0;
}

То, как объект указателя на основе стека ссылается на динамически распределенную память в обоих классах, можно наглядно показать следующим образом:

enter image description here

2 голосов
/ 30 августа 2011

В C # просто используйте P / Invoke, чтобы выделить много памяти, ресурсы и сохранить их.

Вы можете просто использовать неуправляемый код в простом жгуте C #

0 голосов
/ 24 сентября 2012
#include <stdio.h>

void main(){

for(int i = 0; i < 1000; i++)

double* ptr = (double*)malloc(1000000*sizeof(double))

//free(ptr);

ptr = NULL;

}

примечание: хешированная строка кода вызвала утечку памяти, в то время как процесс выделил ее и не вернул ее обратно в ОС

...