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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
#1

Delete void* p = new classobject(); - C++

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

Всем доброго вечера! Возник вопрос, подскажите пожалуйста. Допустим:
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;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2013, 21:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Delete void* p = new classobject(); (C++):

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

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

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

delete void* - C++
class MyClass{ public: int i; }; void main() { MyClass* MyObj = new MyClass; MyObj->i = 10; void* VoidLink =...

Дважды вычислить значение выражения, используя функции возвращающие void и не void - C++
Хай!Помогите решить Дважды вычислить значение выражения, используя функции возвращающие void и не void....

Typedef void (WINAPI *GLEND)(void), как вызывать? - C++
импортирую метод GLEND glmethod = (GLEND) GetProcAddress(hModule, "glEnd"); как его теперь коректно вызвать: typedef void...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MrGluck
Модератор
Эксперт CЭксперт С++
7210 / 4376 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
19.10.2013, 01:07 #31
Цитата Сообщение от Jupiter Посмотреть сообщение
в с++ это может быть только для развлекухи, шаблоны же есть.
не согласен. Можно создать класс, оперирующий сырой памятью и от него обертку класс-наследник, который следил бы за контролем типов (привет private наследованию).

Добавлено через 3 минуты
Кстати, класс-обертку логично было бы сделать шаблонным.
Подробно данная махинация рассматривается у Мейерса в книге "Эффективное использование С++. 50 рекомендаций ..." в правиле 42. Помню меня при прочтении этот прием очень сильно впечатлил
Jupiter
19.10.2013, 01:08
  #32

Не по теме:

Цитата Сообщение от MrGluck Посмотреть сообщение
привет private наследованию
Цитата Сообщение от MrGluck Посмотреть сообщение
не согласен.
еретик. на костре тебе гореть
Кликните здесь для просмотра всего текста

MrGluck
19.10.2013, 01:13
  #33

Не по теме:

Цитата Сообщение от Jupiter Посмотреть сообщение
еретик. на костре тебе гореть
Ну вот, теперь буду думать о себе как о Джордано Бруно.

ValeryS
19.10.2013, 01:16
  #34

Не по теме:

Цитата Сообщение от MrGluck Посмотреть сообщение
теперь буду думать о себе как о Джордано Бруно.
финал его помнишь?

MrGluck
19.10.2013, 01:16
  #35

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
финал его помнишь?
конечно, умел парень зажигать

ValeryS
19.10.2013, 01:18
  #36

Не по теме:

Цитата Сообщение от MrGluck Посмотреть сообщение
конечно, умел парень зажигать
Эт, точно

ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
19.10.2013, 16:36  [ТС] #37
Jupiter, MrGluck, Вот простенький вариант, минимум кода, для общего представления. Подскажыте как реализовать вирт. функцию что будет возвращать данные элемента(узла).
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 <iostream>
#include <Windows.h>
#include <string>
using namespace std;
 
class Baselink
{
public:
 
   Baselink* next; 
   //virtual int getData() {return 1;}
   virtual void showElem()=0;
   virtual ~Baselink(){}
};
...........................................
template<class T>
class link: public Baselink
{
public:
   T data; 
   void showElem(){ cout<<" "<<data;}
   //virtual T getData() { return data;}
};
...........................................
class linklist 
{
private:
   Baselink* first;
public:
 
   linklist() { first = NULL; } 
   template<class T> void additem(T d); 
   void display(); 
};
...........................................
template<class T>
void linklist::additem(T d) 
{
   Baselink* newlink = new link<T>;
   link<T>* p = dynamic_cast<link<T>*>(newlink);
   p->data = d; 
   p->next = first; 
   first = p; 
}
...........................................
void linklist::display()
{
   Baselink* current = first;
   while(current) 
   {
      current->showElem();
   //cout << current->getData() << endl; 
   current = current->next; 
   }
}
...........................................
void main()
{
   setlocale( LC_ALL,"Russian" );  
 
   linklist li; 
   li.additem(25); 
   li.additem("Lana");
   li.additem(49.3);
 
   li.display(); 
 
   cout<<endl;
   system("pause");
}
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.10.2013, 16:51 #38
Цитата Сообщение от ArkTaS Посмотреть сообщение
Подскажыте как реализовать вирт. функцию что будет возвращать данные элемента(узла).
если ты задаешь этот вопрос то ты ещё не понял задание.
как этот список будет использоватся, в том числе и эта "вирт. функцию что будет возвращать данные элемента(узла)" ??
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
19.10.2013, 17:11  [ТС] #39
Jupiter, Я уже давно ушел от конкретного задания. И в посте пишу о реализации контейнера с разными типами элементов. Следуя вашему совету привел в последнем сообщении код реализующий это. Теперь проблема стоит в необходимости расширения функционала контейнера. Необходимо как то получать данные любого из элементов. Как видите комментариями помечена вирт. ф-я возвращающая значение, но она работать не будет
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.10.2013, 17:21 #40
ArkTaS, повторяю вопрос - как ты будешь использовать эту функцию?
C++
1
2
3
4
5
linklist li; 
li.additem(25); 
li.additem("Lana");
li.additem(49.3);
li.getElementAt(...) //что должна примать эта функция? и что она должна возвратить?
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
19.10.2013, 17:29  [ТС] #41
Jupiter, Принимает указатель на элемент, возвращает значение хранящихся в нем данных
C++
1
T Get(Baselink*);
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
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;
}
но лучше бы ты реализовал посетителя
ArkTaS
1 / 1 / 0
Регистрация: 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; 
   }
}
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
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;
}
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
19.10.2013, 18:27  [ТС] #45
Jupiter, Для работы с пользовательскими типами придется код для каждого из них отдельно добавлять ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2013, 18:27
Привет! Вот еще темы с ответами:

Что значит void(*f)()=(void(*)()func? - C++
void(*f)()=(void(*)())func; Объясните, пожалуйста, что значит этот код.

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

Error C2084: функция "void mehanizm:print(void)" уже имеет текст реализации - C++
Добрый день, я столкнулся с проблемой вывода элемента на экран, выбивает: &quot;error C2084: функция &quot;void mehanizm::print(void)&quot; уже имеет...

Чем отличается delete[] от delete? - C++
чем отличается? delete mas от delete mas


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

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

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