Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
1

delete void*

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

Author24 — интернет-сервис помощи студентам
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;"? Просто хочется выделить под удаление ресурсов отдельную функцию, однако выделенные ресурсы локальны и не видны...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.02.2010, 15:33
Ответы с готовыми решениями:

Перенаправление из Void в другой Void
Решил я значит сделать себе терминал как в Fallout,и столкнулся с такой проблемой,из void нельзя...

Void * processor to (void(Args.) (*processor)
Здравствуйте. Имеем void* значением которого является адрес функции. Как скастить этот указатель в...

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

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

24
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
04.02.2010, 18:36  [ТС] 21
Author24 — интернет-сервис помощи студентам
Любопытно но сложновато для меня (плотно не изучал наследование). При таком методе все что хочется автоматически удалять должно наследоваться от iref ? Что произойдет если объект создастся в стеке (как локальная переменная) а не в куче? Или при освобождении памяти это не важно?
0
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 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
0
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
04.02.2010, 19:10  [ТС] 23
Автоматически удалять не будет.. можно просто все зачистить в том случаи когда больше ни один объект не нужен..
Я наверное не так высказался. Я имел ввиду что можно не следить за памятью этих объектов и просто написать конце программы этот iref::clear_all();
0
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
04.02.2010, 19:16 24
Цитата Сообщение от insideone Посмотреть сообщение
Я имел ввиду что можно не следить за памятью этих объектов и просто написать конце программы этот iref::clear_all();
Можно.. но где есть гарантия на то что хватит памяти для постоянного хранения объектов..
0
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
04.02.2010, 19:32  [ТС] 25
Я сейчас имею дело с крупными объектами-обертками для работы с DirectX и так же крупные объекты игрового движка... если для них не хватит памяти то смысла особо и нет чего то запускать
0
04.02.2010, 19:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.02.2010, 19:32
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru