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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
18.10.2013, 21:21     Delete void* p = new classobject(); #1
Всем доброго вечера! Возник вопрос, подскажите пожалуйста. Допустим:
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;
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
19.10.2013, 00:23  [ТС]     Delete void* p = new classobject(); #21
ValeryS, Это если пользовательские типы позволяют объединение в иерархию. А у меня в качестве данных может быть любой тип: встроенный тип, разные не связанные между собою наследованием классы

Добавлено через 4 минуты
castaway, изначально в начале поста, был описан класс. И там же информация о типе хранится как enum
К концу поста пришли к тому что нужно, это как то это улучшить, с помощью шаблонов.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ct0r
C++/Haskell
 Аватар для ct0r
1550 / 569 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
19.10.2013, 00:26     Delete void* p = new classobject(); #22
Я так понимаю, что кто-то хочет сделать type-erasure и прийти к boost.any ?
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,066
19.10.2013, 00:27     Delete void* p = new classobject(); #23
Цитата Сообщение от ArkTaS Посмотреть сообщение
ValeryS, Это если пользовательские типы позволяют объединение в иерархию. А у меня в качестве данных может быть любой тип:
сделай базовый класс размером с байт, в конце концов все к байтам приводится
типа такого
C++
1
2
3
4
5
class MyAbstract
{
unsigned char dt;
virtual ~MyAbstract();
}
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
19.10.2013, 00:33  [ТС]     Delete void* p = new classobject(); #24
Jupiter, Будьте так любезны перефразируйте свою фразу еще раз
Цитата Сообщение от Jupiter Посмотреть сообщение
да, и все инстансы шаблона должны наследоватся от базового не шаблонного класса
.
Если вы имели ввиду создание иерархия для хранения объектов типов этой иерархии то это не подходящий вариант. Так как контейнер должен хранить не связанные между собой наследованием типы.

Добавлено через 22 секунды
ct0r, да boost/any

Добавлено через 4 минуты
ValeryS,Из за наличия одних только вирт. ф-й он будет занимать 4 байта. И не понятно как это поможет связать встроенные типы(int, double,float ) и разные польз. типы.
ct0r
C++/Haskell
 Аватар для ct0r
1550 / 569 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
19.10.2013, 00:33     Delete void* p = new classobject(); #25
Цитата Сообщение от ArkTaS Посмотреть сообщение
да boost/any
А в чем тогда загвоздка? Код буста в свободном доступе.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.10.2013, 00:34     Delete void* p = new classobject(); #26
Цитата Сообщение от ArkTaS Посмотреть сообщение
Если вы имели ввиду создание иерархия для хранения объектов типов этой иерархии то это не подходящий вариант. Так как контейнер должен хранить не связанные между собой наследованием типы.
для пользователя контейнера типы будут не связанными между собой наследованием, а как оно реализовано внутри пользователя не касается
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
19.10.2013, 00:36  [ТС]     Delete void* p = new classobject(); #27
ValeryS, какой то рабский труд получится
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,066
19.10.2013, 00:41     Delete void* p = new classobject(); #28
Цитата Сообщение от ArkTaS Посмотреть сообщение
ValeryS,Из за наличия одних только вирт. ф-й он будет занимать 4 байта.
не факт
зависит от разрядности
Цитата Сообщение от ArkTaS Посмотреть сообщение
И не понятно как это поможет связать встроенные типы(int, double,float ) и разные польз. типы.
свои типы вводить
а иначе никак, по моему
посмотри как это сделали в Qt или cli
все что не ихние типы.не поддерживается в полном объеме, например нет автоматического удаления

может тебе переписать new\ delete
ct0r
C++/Haskell
 Аватар для ct0r
1550 / 569 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
19.10.2013, 00:48     Delete void* p = new classobject(); #29
Да в целом понятно, как все внутри устроено. Когда делаем присваивание переменной any значения переменной типа Т, то создается некий holder<T>, который наследник от некого общего базового класса. У него есть виртуальные функции для получения type_info. А при присваивании обратно просто идет сравнение typeid(T) c сохраненным type_info. Чтобы влезть в детали, надо почитать исходники.
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
19.10.2013, 00:49  [ТС]     Delete void* p = new classobject(); #30
ValeryS, а как в Qt называется подобный контейнер ?

Добавлено через 1 минуту
ct0r, С утра почитаю на свежую голову. Всем спокойной ночи !
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4928 / 2671 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
19.10.2013, 01:07     Delete void* p = new classobject(); #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  [ТС]     Delete void* p = new classobject(); #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
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.10.2013, 16:51     Delete void* p = new classobject(); #38
Цитата Сообщение от ArkTaS Посмотреть сообщение
Подскажыте как реализовать вирт. функцию что будет возвращать данные элемента(узла).
если ты задаешь этот вопрос то ты ещё не понял задание.
как этот список будет использоватся, в том числе и эта "вирт. функцию что будет возвращать данные элемента(узла)" ??
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
19.10.2013, 17:11  [ТС]     Delete void* p = new classobject(); #39
Jupiter, Я уже давно ушел от конкретного задания. И в посте пишу о реализации контейнера с разными типами элементов. Следуя вашему совету привел в последнем сообщении код реализующий это. Теперь проблема стоит в необходимости расширения функционала контейнера. Необходимо как то получать данные любого из элементов. Как видите комментариями помечена вирт. ф-я возвращающая значение, но она работать не будет
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2013, 17:21     Delete void* p = new classobject();
Еще ссылки по теме:

delete[] *pointer vs. delete pointer и утечка памяти C++
не получается передать массив из "void Vvod" в "void CalculatingEstimates" C++
C++ LNK2019: ссылка на неразрешенный внешний символ "void __cdecl run(void)" (?run@@YAXXZ) в функции _wmain

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

Или воспользуйтесь поиском по форуму:
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.10.2013, 17:21     Delete void* p = new classobject(); #40
ArkTaS, повторяю вопрос - как ты будешь использовать эту функцию?
C++
1
2
3
4
5
linklist li; 
li.additem(25); 
li.additem("Lana");
li.additem(49.3);
li.getElementAt(...) //что должна примать эта функция? и что она должна возвратить?
Yandex
Объявления
19.10.2013, 17:21     Delete void* p = new classobject();
Ответ Создать тему
Опции темы

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