Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Динамическое размещение объекта в определённом месте памяти с последующим её освобождением / 4 сообщений из 4, страница 1 из 1
04.10.2013, 18:28
    #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
04.10.2013, 19:25
    #38417366
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое размещение объекта в определённом месте памяти с последующим её освобождением
Compositum, если ты о placement new, то программист обязан сам вызвать Деструктор и освободить память, если это нужно.
...
Рейтинг: 0 / 0
04.10.2013, 21:19
    #38417438
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое размещение объекта в определённом месте памяти с последующим её освобождением
MasterZivplacement new
Спасибо.
...
Рейтинг: 0 / 0
04.10.2013, 21:56
    #38417450
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое размещение объекта в определённом месте памяти с последующим её освобождением
Compositum,

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


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