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

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.85
insideone
Модератор
Автор FAQ
3638 / 916 / 49
Регистрация: 10.01.2010
Сообщений: 2,469
#1

delete void* - C++

04.02.2010, 15:33. Просмотров 3367. Ответов 24
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class MyClass{
public:
    int i;
};
 
void main()
{
    MyClass* MyObj = new MyClass;
    MyObj->i = 10;
    void* VoidLink = MyObj;
    delete VoidLink; // освободится ли память?
    std::cout << MyObj->i; // уже не 10
}
Освободит ли память "delete VoidLink;"? Просто хочется выделить под удаление ресурсов отдельную функцию, однако выделенные ресурсы локальны и не видны...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.02.2010, 15:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос delete void* (C++):

Где void? - C++
Скорее всего тема опять будет пустовать, но я таки попробую. if ( __SETP__(_AH &amp; 0x44, 0) ) v4f9ab0(0, 0,...

delete vs. delete [] - C++
Всем привет, в разница использования delete и delete ? я читал, что delete используется для освобождения массивов, а delete для...

Backspace и Delete - C++
функция обрабатывает ввод символов 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, +, –. По нажатию клавиши Esc ввод прекращается, и функция возвращает...

Ошибка при delete - C++
Здравствуйте, вылетает такая ошибка, почему? Указатель верный, до этого места все нормально работает

оператор delete у null - C++
Один человек говорил что опасно использовать такой код (delete к null указателю), ну или когда-то было опасно, и что желательно перед...

Ошибка E2044 - operator delete must return void - C++ Builder
Среда - С++ Builder 2006 Суть такова: Только начали изучать сишку. Выполняю домашку, нужно составить форму с кнопкой и вычисляемым...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Evg
Эксперт CАвтор FAQ
17634 / 5858 / 378
Регистрация: 30.03.2009
Сообщений: 16,156
Записей в блоге: 26
04.02.2010, 17:13 #16
Цитата Сообщение от insideone Посмотреть сообщение
ну если бы были объекты для который не нужен деструктор то можно было бы сделать так?
В теории да, но ограничения для этого я писал выше. Т.е. 100% гарантии, что это будет работать, скорее всего нет
oxotnik
1589 / 1066 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
04.02.2010, 17:17 #17
вообще то в С++ приводить к void* это плохая практика... не для этого придумывалось ООП со своими наворотами.
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
04.02.2010, 17:36 #18
Цитата Сообщение от insideone Посмотреть сообщение
ну если бы были объекты для который не нужен деструктор то можно было бы сделать так?
тогда, наверное, стоит подумать, нужны ли такие объекты.

Добавлено через 3 минуты
Цитата Сообщение от oxotnik Посмотреть сообщение
Для того что бы не заморачиваться с выделением/освобождением памяти есть std::auto_ptr
Что бы хранить массивы объектов есть куча контейнеров (для примера std::vector), при разрушении которого будут вызваны соотв. деструкторы объектов, помещенных в контейнер.
если я правильно понял, то объекты - разных типов. т.е. опять же совать их в std::vector<void*> v ?
в деструкторе вектора удалится память только под вектор (под его четыре указателя, каквые составляют в большинстве реализаций сам вектор). а сами объекты, на которые указывали эти указатели, будут ждать освобождения памяти, выделенной под приложение.
oxotnik
1589 / 1066 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
04.02.2010, 17:47 #19
Цитата Сообщение от novi4ok Посмотреть сообщение
если я правильно понял, то объекты - разных типов. т.е. опять же совать их в std::vector v ? в деструкторе вектора удалится память только четырех указателей, каквые составляют в большинстве реализаций сам вектор. а сами объекты, на которые указывали эти указатели, будут ждать освобождения памяти, выделенной под приложение.
если делать так:
Код
CSomeClass *pSomeClass = new CSomeClass();
vector <CSomeClass*>v;
v.push_back(pSomeClass);
то естественно само ниче не удалится
а для разных типов можно сделать базовый шаблон
ISergey
Maniac
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 1
04.02.2010, 18:30 #20
Можно такой фигни по навыдумывать..

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <algorithm>
#include <iostream>
#include <vector>
 
 
class iref{
public:
    iref(iref* rhs):count(1) { vec.push_back(rhs); }
    virtual ~iref(){ count = 0; }
 
    virtual void release() { --count; if(!count)delete this; }  
    virtual void add()     { ++count; }
    //.......
    static void clear_all(){
        for(std::vector<iref*>::iterator i = vec.begin(); 
            i != vec.end(); 
            ++i)
            (*i)->iref::release();
        vec.clear();
    }
protected:
    int count;
    static std::vector<iref*> vec;
};
 
std::vector<iref*> iref::vec;
 
class a: public iref{
public:
    a(): iref(this) { std::cout << "a(): iref()"  << std::endl; }
    virtual ~a(){ std::cout << "~a(): iref()" << std::endl; }
 
    virtual void release() {
        --count; 
        if(!count){
            vec.erase(std::find(vec.begin(), vec.end(), this));
            delete this;
        }  
    }
};
 
class b: public iref{
public:
    b(): iref(this) { std::cout << "b(): iref()"  << std::endl; }
    virtual ~b(){ std::cout << "~b(): iref()" << std::endl; }
 
    virtual void release() {
        --count; 
        if(!count){
            vec.erase(std::find(vec.begin(), vec.end(), this));
            delete this;
        }  
    }
};
 
int main(){
    std::vector<iref*> v;
 
    a *a1 = new a;
    a *a2 = new a;
    a *a3 = new a;
    b *b1 = new b;
 
    b1->release();
    a1->release();
 
    iref::clear_all();
 
    return 0;
}
http://codepad.org/W1dNHGl0
insideone
Модератор
Автор FAQ
3638 / 916 / 49
Регистрация: 10.01.2010
Сообщений: 2,469
04.02.2010, 18:36  [ТС] #21
Любопытно но сложновато для меня (плотно не изучал наследование). При таком методе все что хочется автоматически удалять должно наследоваться от iref ? Что произойдет если объект создастся в стеке (как локальная переменная) а не в куче? Или при освобождении памяти это не важно?
ISergey
Maniac
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 1
04.02.2010, 19:04 #22
Цитата Сообщение от insideone Посмотреть сообщение
Что произойдет если объект создастся в стеке (как локальная переменная)
Ни че хорошего..
Но можно маленько переделать...
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <algorithm>
#include <iostream>
#include <vector>
 
class iref{
public:
    iref():count(1) { }
    virtual ~iref(){ count = 0; }
 
    virtual void release() { --count; if(!count)delete this; }  
    virtual void add()     { ++count; }
    //.......
    static void *operator new(size_t size)
    { 
        void *rhs = ::operator new(size);
        vec.push_back(static_cast<iref*>(rhs));
        return rhs;
    }
    static void clear_all(){
        for(std::vector<iref*>::iterator i = vec.begin(); 
            i != vec.end(); 
            ++i)
            (*i)->iref::release();
        vec.clear();
    }
protected:
    int count;
    static std::vector<iref*> vec;
};
 
std::vector<iref*> iref::vec;
 
class a: public iref{
public:
    a(): iref() { std::cout << "a(): iref()"  << std::endl; }
    virtual ~a(){ std::cout << "~a(): iref()" << std::endl; }
 
    virtual void release() {
        --count; 
        if(!count){
            vec.erase(std::find(vec.begin(), vec.end(), this));
            delete this;
        }  
    }
};
 
class b: public iref{
public:
    b(): iref() { std::cout << "b(): iref()"  << std::endl; }
    virtual ~b(){ std::cout << "~b(): iref()" << std::endl; }
 
    virtual void release() {
        --count; 
        if(!count){
            vec.erase(std::find(vec.begin(), vec.end(), this));
            delete this;
        }  
    }
};
 
int main(){
    std::vector<iref*> v;
 
    a *a1 = new a;
    a *a2 = new a;
    a *a3 = new a;
    b *b1 = new b;
 
    b st1;
    a st2;
 
    b1->release();
    a1->release();
 
    iref::clear_all();
 
    return 0;
}
http://codepad.org/IxVgO4NE

Цитата Сообщение от insideone Посмотреть сообщение
При таком методе все что хочется автоматически удалять должно наследоваться от iref ?
Автоматически удалять не будет.. можно просто все зачистить в том случаи когда больше ни один объект не нужен..

Для автоматического удаления есть умные указатели...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class x{
public:
    x() { std::cout << "x()"  << std::endl; }
    ~x(){ std::cout << "~x()" << std::endl; }
 
    void foo(){ }
};
 
int main(){
 
    std::auto_ptr<x> p_x(new x);
    p_x->foo();
    return 0;
}
http://codepad.org/bKOYRA6E
insideone
Модератор
Автор FAQ
3638 / 916 / 49
Регистрация: 10.01.2010
Сообщений: 2,469
04.02.2010, 19:10  [ТС] #23
Автоматически удалять не будет.. можно просто все зачистить в том случаи когда больше ни один объект не нужен..
Я наверное не так высказался. Я имел ввиду что можно не следить за памятью этих объектов и просто написать конце программы этот iref::clear_all();
ISergey
Maniac
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 1
04.02.2010, 19:16 #24
Цитата Сообщение от insideone Посмотреть сообщение
Я имел ввиду что можно не следить за памятью этих объектов и просто написать конце программы этот iref::clear_all();
Можно.. но где есть гарантия на то что хватит памяти для постоянного хранения объектов..
insideone
Модератор
Автор FAQ
3638 / 916 / 49
Регистрация: 10.01.2010
Сообщений: 2,469
04.02.2010, 19:32  [ТС] #25
Я сейчас имею дело с крупными объектами-обертками для работы с DirectX и так же крупные объекты игрового движка... если для них не хватит памяти то смысла особо и нет чего то запускать
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.02.2010, 19:32
Привет! Вот еще темы с ответами:

Как написать это - void fastcall TForml:oOp(void)? - C++ Builder
Добрый день! Подскажите пожайлуста: Как написать это - void fastcall TForml:: DoOp(void)? Как выставить? Не могу найти... ...

Void To Bool - C++ Builder
Как можно void преобразовать в bool? if(Skype1-&gt;Attach(6, VARIANT_TRUE)) { ShowMessage(&quot;ERROR&quot;); } Не работает. Cannot convert...

Приведение к void - C++ Builder
Приветствую. Как правильно в С++ привести данные к типу void? int Data; void *ptrData; ptrData = &amp;Data; // Так правильно? ...

delete или new (typeid(void*))(void*) - C++
Доброе время суток. Пишу список. Телом каждого элемента (el) списка является void указатель(body). (предполагается что тело элемента...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.02.2010, 19:32
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru