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

delete void* - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Составить программу численного дифференцирования функции http://www.cyberforum.ru/cpp/thread92406.html
Составить программу численного дифференцирования функции, заданной табличными значениями, с применением классов: конструктора, деструктора, конструктора по умолчанию, конструктора для копирования, функции инициализации (переустановке значений) set(), функции вычисления значения производной в заданной точке run(), вывода результатов print() и перегрузки оператора =. Для вычисления производной...
C++ Конструктор ссылки? StateManager.h class StateManager{ public: typedef long state_type; typedef void (*executor)(int); StateManager::StateManager(state_type mainState, executor newExec); private: executor exec; struct state_unit{ http://www.cyberforum.ru/cpp/thread92331.html
C++ zlib Двойное архивирование\разархивирование
Использую библиотеку zlib 1.2.3 Нужно сохранять массив объектов в файл и потом загружать её. Вес - 10 мегабайт. Решил сжать перед записью. Сделал... обнаружил что уже сжатый файл тоже бы мог сжаться хорошенько (60кб). Сжал кое как... получил 6кб. Отлично... Пытаюсь разжать дважды. Что то выходит, однако тест загруженого массива объектов в реальной программе показывает баги (этот массив...
C++ ОШИБКА
Что за ошибка: Must use c++ for the type iostream??
C++ пропадающее окно http://www.cyberforum.ru/cpp/thread91622.html
ещё раз здраствуйте. в предыдущий теме вы мне помогли http://www.cyberforum.ru/cpp/thread91603.html спасибо большое. но теперь у меня новая проблема. я использовал несколько програм втом числе и эту http://www.cyberforum.ru/cpp/thread89930.html в языке си. ошибок нет, но окно на секундо появляется и исчезает как-бутто эта программа ничего не делает. помогите пожалуйста.
C++ Внешние объекты в классе Если класс исплользует какую то внешнюю переменную (например hWnd), то как будет более корректно его создать: class MyClass { private: HWND* _myWnd; public: MyClass(HWND* extWnd, ...) :_myWnd(extWnd); } Или нормально создать hWnd глобальным и в классе прописать extern? подробнее

Показать сообщение отдельно
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1344 / 877 / 51
Регистрация: 02.01.2009
Сообщений: 2,642
Записей в блоге: 1
04.02.2010, 19:04     delete void*
Цитата Сообщение от 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
 
Текущее время: 08:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru