Как создать утечку памяти в С++?
Мне просто интересно, как можно создать утечку системной памяти с помощью С++. Я сделал некоторые ошибки в этом, но не так много, я знаю, что на С# это не реально, так как это управляемый код, но задавался вопросом, был ли простой способ сделать это с С++? Я просто подумал, что было бы интересно посмотреть, насколько сильно система страдает из-за неправильного написания кода. Спасибо.
Ответы
Ответ 1
Утечка памяти возникает, когда вы вызываете new
, не вызывая соответствующий delete
позже. Как показано в этом примере кода:
int main() {
// OK
int * p = new int;
delete p;
// Memory leak
int * q = new int;
// no delete
}
Ответ 2
- Создайте указатель на объект и выделите его в куче
- Не удалять его.
- Повторить предыдущие шаги
- ????
- PROFIT
Ответ 3
int main() {
while(true) new int;
}
Ответ 4
Существует много типов утечек памяти:
-
Выделенная память, которая не может быть недоступна, потому что на нее ничего не указывает.
Эти типы утечек легко создавать на C и С++. Они также довольно легко предотвращают, легко обнаруживаются и легко излечиваются. Поскольку их легко обнаружить, есть множество инструментов, свободных и коммерческих, чтобы найти такие утечки.
-
Все еще доступная выделенная память, которая должна была быть выпущена давным-давно.
Эти виды утечек намного сложнее обнаружить, предотвратить или вылечить. Что-то еще указывает на это, и оно будет выпущено в конце концов - например, прямо перед exit()
. Технически говоря, это не совсем утечка, но для всех практических целей это утечка. Многие из предположительно негерметичных приложений имеют такие утечки. Все, что вам нужно сделать, - запустить системный профиль, чтобы увидеть, как какое-то глупое приложение потребляет все больше памяти. Эти типы утечек легко создавать даже на управляемых языках.
-
Выделенная память, которая никогда не должна была быть выделена в первую очередь.
Пример. Пользователь может легко попросить Matlab создать такие утечки. Matlab также довольно агрессивен при создании таких утечек. Когда Matlab получает сбой из malloc
, он переходит в цикл, где он ждет бит, а затем повторяет попытку malloc
. Тем временем ОС безумно пытается справиться с потерей памяти, перетасовывая куски программ из реальной памяти в виртуальную память. В конце концов все находится в виртуальной памяти - и все заходит в тупик.
Ответ 5
Я нашел эту статью полезной для стресс-тестирования - она также содержит примеры кода.
Ответ 6
Просто напишите приложение, которое выделяет "много данных", а затем блокируется до тех пор, пока оно не будет убито. Просто запустите эту программу и оставьте ее в рабочем состоянии.
Ответ 7
В С# просто используйте P/Invoke для выделения большого количества памяти, ручек ресурсов и их сохранения.
Вы можете использовать неуправляемый код просто отлично в простой жгуте С#
Ответ 8
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;
}
Способ, которым объект указателя на основе стека ссылается на динамически распределенную память в обоих классах, может отображаться как показано ниже:
![введите описание изображения здесь]()
Ответ 9
#include <stdio.h>
void main(){
for(int i = 0; i < 1000; i++)
double* ptr = (double*)malloc(1000000*sizeof(double))
//free(ptr);
ptr = NULL;
}
Примечание: хэшированная строка кода вызвала утечку памяти, а процесс выделил ее и не вернул ее обратно в ОС