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

delete void* - C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.85
insideone
Модератор
Автор FAQ
 Аватар для insideone
3630 / 908 / 48
Регистрация: 10.01.2010
Сообщений: 2,446
04.02.2010, 15:33     delete void* #1
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;"? Просто хочется выделить под удаление ресурсов отдельную функцию, однако выделенные ресурсы локальны и не видны...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
insideone
Модератор
Автор FAQ
 Аватар для insideone
3630 / 908 / 48
Регистрация: 10.01.2010
Сообщений: 2,446
04.02.2010, 18:36  [ТС]     delete void* #21
Любопытно но сложновато для меня (плотно не изучал наследование). При таком методе все что хочется автоматически удалять должно наследоваться от iref ? Что произойдет если объект создастся в стеке (как локальная переменная) а не в куче? Или при освобождении памяти это не важно?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1345 / 878 / 51
Регистрация: 02.01.2009
Сообщений: 2,642
Записей в блоге: 1
04.02.2010, 19:04     delete void* #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
 Аватар для insideone
3630 / 908 / 48
Регистрация: 10.01.2010
Сообщений: 2,446
04.02.2010, 19:10  [ТС]     delete void* #23
Автоматически удалять не будет.. можно просто все зачистить в том случаи когда больше ни один объект не нужен..
Я наверное не так высказался. Я имел ввиду что можно не следить за памятью этих объектов и просто написать конце программы этот iref::clear_all();
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1345 / 878 / 51
Регистрация: 02.01.2009
Сообщений: 2,642
Записей в блоге: 1
04.02.2010, 19:16     delete void* #24
Цитата Сообщение от insideone Посмотреть сообщение
Я имел ввиду что можно не следить за памятью этих объектов и просто написать конце программы этот iref::clear_all();
Можно.. но где есть гарантия на то что хватит памяти для постоянного хранения объектов..
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.02.2010, 19:32     delete void*
Еще ссылки по теме:

"delete [] a, b;" эквивалентно "delete [] a; delete [] b;"? C++
Чем отличается delete[] от delete? C++
Delete void* p = new classobject(); C++
C++ Builder Ошибка E2044 - operator delete must return void
Cannot convert from 'void (__thiscall CTest::* )(void)' to 'BYTE *' C++ WinAPI

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

Или воспользуйтесь поиском по форуму:
insideone
Модератор
Автор FAQ
 Аватар для insideone
3630 / 908 / 48
Регистрация: 10.01.2010
Сообщений: 2,446
04.02.2010, 19:32  [ТС]     delete void* #25
Я сейчас имею дело с крупными объектами-обертками для работы с DirectX и так же крупные объекты игрового движка... если для них не хватит памяти то смысла особо и нет чего то запускать
Yandex
Объявления
04.02.2010, 19:32     delete void*
Ответ Создать тему
Опции темы

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