1 / 1 / 1
Регистрация: 01.07.2013
Сообщений: 127
1

Delete void* p = new classobject();

18.10.2013, 21:21. Показов 2737. Ответов 47
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго вечера! Возник вопрос, подскажите пожалуйста. Допустим:
C++
1
2
void* p = new classobject();
delete p;
Как компилятор узнает сколько памяти нужно освободить ? Будут ли утечки после освобождения через delete p, без приведения void* к конкретному типу ?

Добавлено через 2 часа 1 минуту
То есть в таком случае всегда необходимо удалять после приведения типа
C++
1
2
3
void* p = new classobject();
classobject* pObj = (classobject*) p;
delete pObj;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.10.2013, 21:21
Ответы с готовыми решениями:

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

Delete void*
Безопасно ли удалять указатель на тип void. Допустим есть такой код: void * ptr = new char;...

error C2440: 'delete' : cannot convert from 'Song' to 'void *'
Строка, где выдаётся ошибка: delete mas; Деструктор: Song::~Song () { delete song;...

Ошибка cannot convert from type void*(classname::) () to type void*(*)(void*)
Подскажите пожалуйста как избавиться от ошибки? Есть ещё какой-либо способ, кроме как объявить...

47
1 / 1 / 1
Регистрация: 01.07.2013
Сообщений: 127
19.10.2013, 17:29  [ТС] 41
Author24 — интернет-сервис помощи студентам
Jupiter, Принимает указатель на элемент, возвращает значение хранящихся в нем данных
C++
1
T Get(Baselink*);
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
19.10.2013, 17:58 42
ну так и делаей её шаблонной
C++
1
2
3
4
5
6
7
8
9
10
template<class T>
T get_as(BaseElement* node)
{
    link<T>* tmp = dynamic_cast<link<T>*>(node);
        
    if (tmp == 0)
        throw...
        
    return tmp->data;
}
но лучше бы ты реализовал посетителя
0
1 / 1 / 1
Регистрация: 01.07.2013
Сообщений: 127
19.10.2013, 18:08  [ТС] 43
Jupiter, Делал я уже так. Только для ее вызова нужно знать тип, а мы его не знаем. 13 строчка
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template<class T> T ret(Baselink* current)
{
   link<T>* p = dynamic_cast<link<T>*>(current);
   return p->data;
}
 
void linklist::display()
{
   Baselink* current = first;
   while(current) 
   {
 
  // cout << ret<int>(current) << endl; 
   current = current->next; 
   }
}
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
19.10.2013, 18:19 44
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <iostream>
#include <string>
 
struct IVisitor;
 
class BaseNode
{
protected:
    BaseNode* mNext;
    BaseNode(BaseNode* next) : mNext(next) { }
public:
    virtual ~BaseNode() { delete mNext; }
    virtual void accept(IVisitor& visitor) = 0;
};
 
template<class T>
class Node : public BaseNode
{
    T mData;
public:
    Node(const T& data, BaseNode* next) : BaseNode(next), mData(data) {}
    
    T& data() { return mData; }
    
    void accept(IVisitor& visitor);
};
 
struct IVisitor
{
    virtual void visit(Node<char>& node) = 0;
    virtual void visit(Node<int>& node) = 0;
    virtual void visit(Node<float>& node) = 0;
    virtual void visit(Node<double>& node) = 0;
    virtual void visit(Node<std::string>& node) = 0;
};
 
template<class T>
void Node<T>::accept(IVisitor& visitor)
{
    visitor.visit(*this);
    if (mNext != 0)
        mNext->accept(visitor);
}
 
class List
{
    BaseNode* mHead;
public:
    List() : mHead(0) {}
    ~List() { delete mHead; }
    
    template<class T>
    void push_front(const T& item)
    {
        mHead = new Node<T>(item, mHead);
    }
    
    void applyVisitor(IVisitor& visitor)
    {
        mHead->accept(visitor);
    }
};
 
class PrinterVisitor : public IVisitor
{
    std::ostream& mOut;
public:
    PrinterVisitor(std::ostream& out) : mOut(out) {}
    
    void visit(Node<char>& node)
    {
        mOut << node.data() << std::endl;
    }
    
    void visit(Node<int>& node)
    {
        mOut << node.data() << std::endl;
    }
    
    void visit(Node<float>& node)
    {
        mOut << node.data() << std::endl;
    }
    
    void visit(Node<double>& node)
    {
        mOut << node.data() << std::endl;
    }
    
    void visit(Node<std::string>& node)
    {
        mOut << node.data() << std::endl;
    }
};
 
int main() 
{
    List list;
    list.push_front(4);
    list.push_front('c');
    list.push_front(100.500);
    list.push_front(3.14f);
    list.push_front(std::string("hello wlrld"));
    
    PrinterVisitor printerVisitor(std::cout);
    list.applyVisitor(printerVisitor);
    
    return 0;
}
2
1 / 1 / 1
Регистрация: 01.07.2013
Сообщений: 127
19.10.2013, 18:27  [ТС] 45
Jupiter, Для работы с пользовательскими типами придется код для каждого из них отдельно добавлять ?
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
19.10.2013, 18:30 46
ArkTaS, да, иначе ты выбрал не тот язык для разработки
0
1 / 1 / 1
Регистрация: 01.07.2013
Сообщений: 127
19.10.2013, 18:41  [ТС] 47
Jupiter, Да это вероятно лучше выглядит чем хранения указателя на void* и имени типа. Но в обоих случаях придется дописывать код для нового типа. Я то думал что можно сделать универсальный контейнер (
А boost::any класс тоже предназначен для хранения только встроенных типов ? включая собственную библиотеку ? то есть пользовательские опять в пролете
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
19.10.2013, 19:32 48
Цитата Сообщение от ArkTaS Посмотреть сообщение
А boost::any класс тоже предназначен для хранения только встроенных типов ? включая собственную библиотеку ? то есть пользовательские опять в пролете
нет, любой тип который соотвествуетующий требованиям
ValueType requirements
0
19.10.2013, 19:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.10.2013, 19:32
Помогаю со студенческими работами здесь

Void menu(void); что это ? почему не void menu();
void menu(void); что это ? почему не void menu(); void naprimer(void); и это идет в классе это...

delete void*
class MyClass{ public: int i; }; void main() { MyClass* MyObj = new MyClass; MyObj-&gt;i =...

Функция void delete". Требуется идентификатор
В общем, ругается на функцию void delete, не понимаю почему. Помогите исправить. #include...

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


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

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

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