Форум программистов, компьютерный форум 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. Просмотров 1677. Ответов 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;
0
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...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.10.2013, 23:35 #16
Цитата Сообщение от ArkTaS Посмотреть сообщение
Может лучше в виде шаблона реализовать класс elem?
да, и все инстансы шаблона должны наследоватся от базового не шаблонного класса
0
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
19.10.2013, 00:11  [ТС] #17
Jupiter, Не понятна последняя фраза. Я представил все в таком образе:
C++
1
2
3
4
5
6
7
8
9
10
11
12
template <class TYPE>
struct Elem //Класс-элемент контейнера
{
  TYPE data;
  ...... // вспомогательные данные
};
template<class TYPE>
class Storage // Класс-контейнер 
{
  Elem<TYPE>* begin;
  ......
};
Добавлено через 16 минут
Jupiter, А нет, я бред написал, так работать не будет... все элементы то разных типов. Что вы все таки имели ввиду ?
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.10.2013, 00:11 #18
ArkTaS, какая цель? написать контейнер который хранит объекты любого типа или написать контейнер который хранит объекты одного типа? если первое то попробуй дописать свой код и ты увидишь что этого
Цитата Сообщение от ArkTaS Посмотреть сообщение
Я представил все в таком образе
недостаточно и тогда читай мою фразу ещё раз
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
19.10.2013, 00:14 #19
если у тебя будет базовый класс, даже абстрактный, с виртуальным деструктором
ты создаешь дочерний класс приводишь его к базовому
то при удалении сработает деструктор дочернего класса, он же виртуальный
да и new delete себя будут уютней чуствовать
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
19.10.2013, 00:16 #20
Нельзя в run-time создать заведомо неизвестный тип, поэтому подход к таким манипуляциям реализуется только compile-time подходами.
0
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
19.10.2013, 00:23  [ТС] #21
ValeryS, Это если пользовательские типы позволяют объединение в иерархию. А у меня в качестве данных может быть любой тип: встроенный тип, разные не связанные между собою наследованием классы

Добавлено через 4 минуты
castaway, изначально в начале поста, был описан класс. И там же информация о типе хранится как enum
К концу поста пришли к тому что нужно, это как то это улучшить, с помощью шаблонов.
0
ct0r
Игогошка!
1773 / 675 / 42
Регистрация: 19.08.2012
Сообщений: 1,287
Завершенные тесты: 1
19.10.2013, 00:26 #22
Я так понимаю, что кто-то хочет сделать type-erasure и прийти к boost.any ?
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
19.10.2013, 00:27 #23
Цитата Сообщение от ArkTaS Посмотреть сообщение
ValeryS, Это если пользовательские типы позволяют объединение в иерархию. А у меня в качестве данных может быть любой тип:
сделай базовый класс размером с байт, в конце концов все к байтам приводится
типа такого
C++
1
2
3
4
5
class MyAbstract
{
unsigned char dt;
virtual ~MyAbstract();
}
0
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
19.10.2013, 00:33  [ТС] #24
Jupiter, Будьте так любезны перефразируйте свою фразу еще раз
Цитата Сообщение от Jupiter Посмотреть сообщение
да, и все инстансы шаблона должны наследоватся от базового не шаблонного класса
.
Если вы имели ввиду создание иерархия для хранения объектов типов этой иерархии то это не подходящий вариант. Так как контейнер должен хранить не связанные между собой наследованием типы.

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

Добавлено через 4 минуты
ValeryS,Из за наличия одних только вирт. ф-й он будет занимать 4 байта. И не понятно как это поможет связать встроенные типы(int, double,float ) и разные польз. типы.
0
ct0r
Игогошка!
1773 / 675 / 42
Регистрация: 19.08.2012
Сообщений: 1,287
Завершенные тесты: 1
19.10.2013, 00:33 #25
Цитата Сообщение от ArkTaS Посмотреть сообщение
да boost/any
А в чем тогда загвоздка? Код буста в свободном доступе.
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.10.2013, 00:34 #26
Цитата Сообщение от ArkTaS Посмотреть сообщение
Если вы имели ввиду создание иерархия для хранения объектов типов этой иерархии то это не подходящий вариант. Так как контейнер должен хранить не связанные между собой наследованием типы.
для пользователя контейнера типы будут не связанными между собой наследованием, а как оно реализовано внутри пользователя не касается
0
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
19.10.2013, 00:36  [ТС] #27
ValeryS, какой то рабский труд получится
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
19.10.2013, 00:41 #28
Цитата Сообщение от ArkTaS Посмотреть сообщение
ValeryS,Из за наличия одних только вирт. ф-й он будет занимать 4 байта.
не факт
зависит от разрядности
Цитата Сообщение от ArkTaS Посмотреть сообщение
И не понятно как это поможет связать встроенные типы(int, double,float ) и разные польз. типы.
свои типы вводить
а иначе никак, по моему
посмотри как это сделали в Qt или cli
все что не ихние типы.не поддерживается в полном объеме, например нет автоматического удаления

может тебе переписать new\ delete
0
ct0r
Игогошка!
1773 / 675 / 42
Регистрация: 19.08.2012
Сообщений: 1,287
Завершенные тесты: 1
19.10.2013, 00:48 #29
Да в целом понятно, как все внутри устроено. Когда делаем присваивание переменной any значения переменной типа Т, то создается некий holder<T>, который наследник от некого общего базового класса. У него есть виртуальные функции для получения type_info. А при присваивании обратно просто идет сравнение typeid(T) c сохраненным type_info. Чтобы влезть в детали, надо почитать исходники.
0
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
19.10.2013, 00:49  [ТС] #30
ValeryS, а как в Qt называется подобный контейнер ?

Добавлено через 1 минуту
ct0r, С утра почитаю на свежую голову. Всем спокойной ночи !
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2013, 00:49
Привет! Вот еще темы с ответами:

Что значит 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, 00:49
Ответ Создать тему
Опции темы

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