Я некоторое время был вокруг сообщества C++, чтобы услышать, что необработанные указатели «злы» и что их следует избегать как можно больше. Хотя одной из основных причин использования интеллектуальных указателей над исходными указателями является «предотвращение» утечек памяти. Поэтому мой вопрос: даже если вы используете интеллектуальные указатели, возможно ли утечка памяти? Если да, то как это будет возможно?Возможные утечки памяти с помощью интеллектуальных указателей
ответ
Даже при использовании интеллектуальных указателей, возможно ли иметь память ?
Да, если вы не будете стараться избегать создания цикла в своих ссылках.
Если да, то как это будет возможно?
Смарт-указатели, основанные на подсчете ссылок (например, shared_ptr), удалят направленный объект, когда счетчик ссылок, связанный с объектом, падает до нуля. Но если у вас есть цикл в ваших ссылках (A-> B-> A или какой-то более сложный цикл), то подсчет ссылок в цикле никогда не упадет до нуля, потому что умные указатели «поддерживают друг друга живыми».
Ниже приведен пример простой программы, которая утечки памяти, несмотря на использование только shared_ptr для указателей. Обратите внимание, что при запуске, конструкторам напечатать сообщение, но деструкторы никогда не делать:
#include <stdio.h>
#include <memory>
using namespace std;
class C
{
public:
C() {printf("Constructor for C: this=%p\n", this);}
~C() {printf("Destructor for C: this=%p\n", this);}
void setSharedPointer(shared_ptr<C> p) {pC = p;}
private:
shared_ptr<C> pC;
};
int main(int argc, char ** argv)
{
shared_ptr<C> pC(new C);
shared_ptr<C> pD(new C);
pC->setSharedPointer(pD);
pD->setSharedPointer(pC);
return 0;
}
Непонятно, что вы подразумеваете под «самыми» умными указателями. В стандарте C++ есть два (и слабый ptr, который не является умным указателем на свой собственный, но местозаполнитель для получения интеллектуального указателя), и один из них использует счетчик ссылок, а другой - нет. – SergeyA
Я исправил это, спасибо. –
Есть функции, которые освобождают память от умного указателя. В этом случае вы попросите умного указателя прекратить управление памятью. После этого вам решать не просачивать память
- 1. C++ утечки в случае исключения даже с помощью интеллектуальных указателей
- 2. с помощью интеллектуальных указателей с «этим»
- 3. C++ Связанный список с помощью интеллектуальных указателей
- 4. Последствия владения моделью с помощью интеллектуальных указателей
- 5. Неожиданное поведение интеллектуальных указателей
- 6. Возможные утечки памяти на простом jsp-сайте
- 7. Использование интеллектуальных указателей для массива
- 8. Повреждение кучи, возможные утечки памяти, C++
- 9. изменить размер массива указателей без утечки памяти
- 10. Вектор указателей на объекты - утечки памяти
- 11. Как создать массив интеллектуальных указателей?
- 12. Передача интеллектуальных указателей по ссылке
- 13. Использование интеллектуальных указателей для классов
- 14. Итерация и контейнеры интеллектуальных указателей
- 15. Утечки памяти с помощью CArray
- 16. Рисование интеллектуальных указателей в UML
- 17. Продвижение интеллектуальных указателей по ссылке
- 18. Передача интеллектуальных указателей на функцию
- 19. Векторный вызов деструктора интеллектуальных указателей
- 20. Обертка интеллектуальных указателей с заменой метода
- 21. Использование интеллектуальных указателей с соединителем MySQL
- 22. с использованием mem_fun() для контейнера интеллектуальных указателей
- 23. Объявить двунаправленную матрицу с помощью интеллектуальных указателей в C++
- 24. Как предотвратить удаление двойного объекта с помощью интеллектуальных указателей?
- 25. Как читать блок данных из файла с помощью интеллектуальных указателей?
- 26. Как отслеживать объекты класса с помощью интеллектуальных указателей?
- 27. Отслеживание утечки памяти с помощью Valgrind
- 28. Eclipse возможные утечки связи
- 29. Использование интеллектуальных указателей для целей наблюдения
- 30. Правильное использование интеллектуальных указателей и стиля программирования
Может найти [** этот вопрос **] (http://stackoverflow.com/questions/1826902/how-to -avoid-memory-leak-with-shared-ptr) интересно. Вероятно, [** this one **] (http://stackoverflow.com/questions/67174/find-memory-leaks-caused-by-smart-pointers) тоже. Оба они напрямую связаны с вашим преобладающим вопросом (и были найдены путем поиска «при использовании интеллектуальных указателей, возможно ли утечка памяти» на этом сайте). – WhozCraig