Форум программистов, компьютерный форум CyberForum.ru

Динамическое размещение объекта в определённом месте памяти с последующим её освобождением - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Написать процедуру удаления из заданного списка, все вхождения элемента с заданным значением http://www.cyberforum.ru/cpp-beginners/thread969032.html
Написать программу, процедуру удаления из заданного списка, все вхождения элемента с заданным значением.
C++ Дано массивы. Посортировать их указанным в соответствии с вариантом методами Даны два одномерные массивы А (a , , ..., a ) и B (b , b , ..., b ) размеры которых равны n и m соответственно. Посортировать их указанным в соответствии с вариантом методами. Упорядоченные массивы слить в массив С (с , с , ..., с ). http://s5.********************/uploads/thumbs/2013/10/c8cba73784f67cc2df7d2babf4ef7e50.png Помогите пожалуйста хоть что-нибудь, заранее благодарен! Спасибо! ! ! http://www.cyberforum.ru/cpp-beginners/thread969030.html
Даны сведения о высоте над уровнем моря 8 горных вершин C++
1) Даны сведения о высоте над уровнем моря 8 горных вершин. Все значения выражены в метрах. Распечатать названия вершин, высота которых превышает 3000 м над уровнем моря. Помогите, хоть чуточку!!! Пожалуйста! Спасибо! ! !
Как получить число в текстовом десятичном виде (!) в кодировке ASCII? C++
ответ к задаче мне надо представить в файле .txt. Ответ должен представлять не отрицательное число в текстовом десятичном виде в кодировке ASCII.Суть самой задачи не важна. в файл output.txt записываю переменную bstr. bstr - это преобразованная к строке переменная b, плюс к ней дописываю строку ".00" чтобы получить "десятичный вид". Но это не правильно. Код приведенный ниже работает, но ответ не...
C++ Поправить код http://www.cyberforum.ru/cpp-beginners/thread969008.html
всем привет, на днях открывал тему - про Октаэдр, нужен был код, не кто не смог помочь, я тут искал и нашёл то что нужно, только проблема в том что там другая фигара((, нужно немного код изменить, у мня с математикой плохо , а сдавать надо завтра, кто может запустите код посмотрите - что нужно в формулах поменять, спасибо. вот код: #include <iostream> #include <graphics.h> #include...
C++ орогие программисты Очень нужна ваша помощь. Нужно написать программу, которая выводит содержимое файла на экран и определяет символ, с которого начинается самое длинное слово текста. По нажатию произвольной клавиши выделить все вхождения данного символа в тексте. Пока сделал вот что int main () { setlocale(LC_CTYPE, "rus"); FILE *f1=fopen("C:/Users/User/Desktop/file.txt","r+"); if(f1==NULL) { ... подробнее

Показать сообщение отдельно
include_brain
3 / 3 / 0
Регистрация: 13.09.2013
Сообщений: 38

Динамическое размещение объекта в определённом месте памяти с последующим её освобождением - C++

04.10.2013, 18:39. Просмотров 525. Ответов 14
Метки (Все метки)

Доброго времени суток.

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

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

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

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

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

C++
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
#include <iostream>
#include <exception>
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{    
    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;
}
Спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru