C ++ - утечка памяти, вызванная использованием размещения New Over * этот указатель? -- c++ пол Связанный проблема

C++ - memory leak caused by using placement new over *this pointer?


1
vote

проблема

русский

Как известно, размещение New просто строит объект без выделения любой памяти. Также все члены в классе <Код> 5.5.10 являются объектами вместо указателей, хотя <код> 5.5.11 внутренне удерживает динамический массив, который будет освобожден, когда <код> 5.5.12 объекта быть разрушенным. И <код> 5.5.13 указывает на память, выделенную на стеке, что означает, что деструктор всегда будет вызываться. Поэтому я думаю, что такое размещение нового здесь, просто перезаписывает оригинальный объект. Вот простой пример. Использование памяти продолжает идти вверх, пока я запускаю этот пример (на VS 2019).

 <код> 5.5.14  
Английский оригинал

As we know, placement new just constructs an object without allocating any memory. Also all members in the class Resource are objects instead of pointers, although std::string internally holds a dynamic array which will be freed when the std::string object is being destroyed. And *this points to the memory allocated on the stack, which means the destructor will be always called. So I think what placement new does here is just overwriting the original object. Here is a simple example. The memory usage keeps going up while I run this example (on VS 2019).

class Resource { public:     Resource() {};     Resource(const std::string& s) : str(s)     {         new(this)Resource();     }       private:     std::string str;  };    int main() {     while (true)         Resource resource("hello"); } 
</div
  
         
         

Список ответов

4
 
vote
vote
Лучший ответ
 
<Р> Стандарт (последний проект) говорит:
<Р> [basic.life] <Р> Программа может положить конец жизни любого объекта путем повторного хранения, занимающую объект ... если нет явного вызова деструктора или если удаление выражение не используется, чтобы освободить память, <сильный> деструктор не неявно вызывается и любая программа, которая зависит от побочных эффектов, вызываемых деструктора имеет неопределенное поведение .
<Р> Таким образом, так как конструктор повторно хранения <код> *migrations-namespace*0 для динамического объекта <сильный> без вызова деструктора исходного объекта, что деструктор не вызывается. Это деструктор, где член строки был бы уничтожен, и ее память освобождаться.
<Р>. Заключение: Do не Placement новый более <код> *migrations-namespace*1
 

The standard (latest draft) says:

[basic.life]

A program may end the lifetime of any object by reusing the storage which the object occupies ... if there is no explicit call to the destructor or if a delete-expression is not used to release the storage, the destructor is not implicitly called and any program that depends on the side effects produced by the destructor has undefined behavior.

So, since the constructor reuses the storage of *this for a dynamic object without calling the destructor of the original object, that destructor is never called. That destructor is where the string member would have been destroyed and its memory deallocated.


Conclusion: Don't Placement-new over *this.

</div
 
 

Связанный проблема

23  Почему я не могу открыть видео AVI в OpenCV?  ( Why cant i open avi video in opencv ) 
Я только что написал простой пример чтения видео с OpenCv2.3.1, но кажется, что я не могу открыть видео AVI в любом случае: ( <Код> VideoCapture capture("gui...

-1  Мусор с указателями в классе, C ++  ( Garbage with pointers in a class c ) 
Я использую Borland Builder C ++. У меня есть утечка памяти, и я знаю, что это должно быть из-за этого класса, который я создал, но я не уверен, как это испра...

0  Проблемы с повышением :: ptr_vector и Boost :: любой  ( Problems with boostptr vector and boostany ) 
Хорошо, так что я сомневался, я хочу знать, если это возможно: Я использую базу данных, с общими данными (строки, ints, bools и т. Д.). Всякий раз, когда об...

1  Использование Typedefs соответствующим образом, чтобы избежать «загрязнения Typedef»  ( Using typedefs appropriately to avoid typedef contamination ) 
Я разрабатываю определенные функции для более широкого включения в охватывающем проекте и «особенности», над которыми я работаю, являются некоторые классы, со...

0  Компиляция интерфейса C ++  ( C interface compiling ) 
Редактировать: Я выяснил решение. Я не добавил --combine в моих инструкциях с компиляции, и это генерировало ошибки. Я в процессе работы через делите...

1  Opencv Изображение Цветовое пространство Преобразование с использованием CVTColor  ( Opencv image color space transformation using cvtcolor ) 
Я использую ниже OpenCV API для преобразования цветового пространства: <код> cvtColor(<input mat>, <output mat>, COLOR_RGB2RGBA); Однако выходное изобра...

1  Установка значения строки и строки  ( Setting value of string to string ) 
У меня есть строка и AMP; Параметр, и я хочу назначить его строковым параметром. Как это можно сделать. ...

6  Теоретически, находит_енди параллельно?  ( In theory is find end parallelizable ) 
В настоящее время я работаю над open -Под предложению Для достижения параллельной функциональности проекту я работаю, но я столкнулся с дорожным блоком с f...

2  Замена DLL со статической библиотекой  ( Replacing a dll with the static library ) 
Ударная точка: У меня есть код C ++, который ссылается на стороннюю статическую библиотеку, которая ссылается на WS2_32.Lib. <Сильная> Цель: Я изучаю спо...

4  Преобразовать фильм в Openni * .oni видео  ( Convert movie to openni oni video ) 
the библиотека Kinect Openni использует пользовательский формат видеофайла для хранения видеороликов, которые содержат информацию RGB + D. Эти видео имеют р...

4  Должны быть использованы кронштейны для одной строки условных утверждений? [закрыто]  ( Shall brackets be used for one line conditional statements ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> <Путь d = "M15 6.38A6.48 6.48 0 007.78. 04H-.02A6.49 6.49 0 002.05 ...

0  QNATYIMAGE: невозможно прикрепить к общему сегменту памяти  ( Qnativeimage unable to attach to shared memory segment ) 
Я видел, что есть один та же тема: Ошибка OPENCV в оконечной оболочке для IMREAD: QNATYIMAGE: Невозможно прикрепить к общему сегменту памяти Этот нить был о...

2  ODBC и NLS_LANG  ( Odbc and nls lang ) 
Допустим, я создал две разные исполняемые файлы программы, например, в C ++. По какой-то причине две программы внутреннее представление текста отличаются др...

1  STD :: CIN непосредственно к функции  ( Stdcin directly to a function ) 
Недавно я наткнулся на следующую часть кода. Я не знаю, имеет ли это какой-либо смысл, я просто пытаюсь его понять: <код> object Gender extends Enumeration ...

7  GLREADPIXELS () Устанавливает ошибку GL_inValid_Operation  ( Glreadpixels sets gl invalid operation error ) 
Я пытаюсь реализовать цвет выбора с FBO. У меня есть многосмысленные FBO (FBO [0]), которые я использую для визуализации сцены, и у меня нет многоспущенных FB...




© 2021 www.qaru.top All Rights Reserved. Q&A House все права защищены


Licensed under cc by-sa 3.0 with attribution required.