powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Динамическое размещение объекта в определённом месте памяти с последующим её освобождением
4 сообщений из 4, страница 1 из 1
Динамическое размещение объекта в определённом месте памяти с последующим её освобождением
    #38417324
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.

В C++ имеется возможность размещать объект по чётко определённому, указанному разработчиком, адресу в памяти. В свете этого у меня возник вопрос об освобождении памяти, использованной таким образом.

Пусть, к примеру, у меня имеется некоторый массив объектов char (выделенный ранее динамически) и указывающий на адрес, по которому требуется разместить объект некоторого класса A.

На вскидку, мне видится три возможных варианта освобождения памяти. В коде ниже показываю все три варианта. В каждом из них происходит вызов деструктора, но я сомневаюсь, в каждом ли из них производится освобождение памяти...

Интуитивно считаю, что в третьем варианте память должна освобождаться (деструктор там я вызываю вручную, иначе он не будет вызван). Оператору delete[] указываю "родной" указатель типа char , которому и была изначально выделена память.

Но вот первый и второй вариант... С одной стороны, я использовал new , а с другой - я ведь не выделял новую память, а указал её адрес... Вот что в данном случае происходит? Происходит ли освобождение памяти, или же всё ограничивается банальным вызовом деструктора без последующего освобождения памяти?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
#include <iostream>
#include <exception>
#include <vector>
using namespace ::std;

class A{
private:
	double x;
public:
	A() : x(0) { cout << "A class; ptr: " << this << " created." << endl; }	
	~A() { cout << "A class; ptr: " << this << " destroyed." << endl; }
};

int main(int argc, char* argv[])
try{		
	static_assert(sizeof(char) == 1, "Unexpected size of char.");
	int x = -1; // Variants of memory clearing
	while (x < 0 || x > 2) {
		cout << "Variant (0,1,2): ";
		cin >> x;
	}
	char* p = new char[sizeof(A)]; // some memory area...
	
	A* a = new(p)A(); // Place my object in the 'p' address.
	
	// Here is my basic work to do...
	
	// Now I must to free my memory:
	if(!x){ // First variant
		delete a;			
	}
	else if (x == 1){ // Second variant
		delete reinterpret_cast<A*>(p);	
	}
	else if (x == 2){ // Third variant
		a->~A();		
		delete[] p;	
	}
	else{
		throw runtime_error("Invalid variant!");
	}
	a = nullptr;
	p = nullptr;
	
	cout << endl;	
}
catch(exception& e){
	cerr << e.what() << endl;
	return 1;
}
catch(...){
	cerr << "Unknown exception." << endl;
	return 2;
}



Спасибо.
...
Рейтинг: 0 / 0
Динамическое размещение объекта в определённом месте памяти с последующим её освобождением
    #38417366
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum, если ты о placement new, то программист обязан сам вызвать Деструктор и освободить память, если это нужно.
...
Рейтинг: 0 / 0
Динамическое размещение объекта в определённом месте памяти с последующим её освобождением
    #38417438
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivplacement new
Спасибо.
...
Рейтинг: 0 / 0
Динамическое размещение объекта в определённом месте памяти с последующим её освобождением
    #38417450
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum,

Первый и второй вариант невалиден, поскольку delete-у не предшествует new выделяющее память под хранение объекта класса. Рассмотри свой пример применительно к другому типу памяти (стек):
Код: plaintext
1.
2.
3.
4.
char buffer[sizeof(A)];
A* pa = new (buffer) A();
pa->~A();
delete pa; // с какого перепуга мы будет освождать память которую мы не выделяли?
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Динамическое размещение объекта в определённом месте памяти с последующим её освобождением
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]