Форум программистов, компьютерный форум 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;
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.10.2013, 21:43     Delete void* p = new classobject(); #2
Цитата Сообщение от ArkTaS Посмотреть сообщение
Как компилятор узнает сколько памяти нужно освободить ?
в случае с void* компилятор никак не может узнать

Цитата Сообщение от ArkTaS Посмотреть сообщение
Будут ли утечки после освобождения через delete p, без приведения void* к конкретному типу ?
будут
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
18.10.2013, 22:22  [ТС]     Delete void* p = new classobject(); #3
Так даже меньше кода
C++
1
2
void* p = new classobject();
delete (classobject*) p;
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.10.2013, 22:29     Delete void* p = new classobject(); #4
Цитата Сообщение от ArkTaS Посмотреть сообщение
Так даже меньше кода
глупости
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
18.10.2013, 22:31     Delete void* p = new classobject(); #5
ArkTaS,
скажи а зачем это надо?
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
18.10.2013, 22:53  [ТС]     Delete void* p = new classobject(); #6
ValeryS, Пишу контейнерный класс для хранения разных типов

Добавлено через 3 минуты
Jupiter, В чем же ? Если вы решили что я для развлекухи сворачиваю и разворачиваю тип то это не так.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.10.2013, 22:55     Delete void* p = new classobject(); #7
Цитата Сообщение от ArkTaS Посмотреть сообщение
В чем же ? Если вы решили что я для развлекухи сворачиваю и разворачиваю тип то это не так
в с++ это может быть только для развлекухи, шаблоны же есть.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
18.10.2013, 22:55     Delete void* p = new classobject(); #8
Цитата Сообщение от ArkTaS Посмотреть сообщение
ValeryS, Пишу контейнерный класс для хранения разных типов
ну и как ты будешь их удалять не зная подо что выделил?
и как себя поведут конструкторы и деструкторы?
может тебе malloc проще использовать
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
18.10.2013, 23:00     Delete void* p = new classobject(); #9
Цитата Сообщение от Jupiter Посмотреть сообщение
будут
Разве? По-моему не будут.
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
18.10.2013, 23:06  [ТС]     Delete void* p = new classobject(); #10
ValeryS, Если вкратце как то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
enum type {class1, doubleT}
struct elem
{
  type T;
  void* data;
  elem(class1 tmp):data(new class1(tmp)),T(class1){}
  elem(double tmp):data(new double(tmp)),T(doubleT){}
~elem()
{
  if (T == class1) delete (class*)data;
  else if ( T == doubleT)  delete (double*)data;
}
}
Для встроенных типов вроде double,int, float и т.д ведь не обязательно приводить приведения типа (double*)data ? там же нет деструктора, просто память почистить нужно

Добавлено через 2 минуты
Jupiter, Или как вариант получил тестовое задание ...
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.10.2013, 23:07     Delete void* p = new classobject(); #11
Цитата Сообщение от castaway Посмотреть сообщение
Разве? По-моему не будут.
деструктор точно не будет вызван, а если определен явный деструктор(значит его же зачем-то определили, не просто же так) читай у тебя уже что-то утекло
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
18.10.2013, 23:07  [ТС]     Delete void* p = new classobject(); #12
castaway,подозреваю что для встроенных типов не будут, а для пользовательских будут
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.10.2013, 23:17     Delete void* p = new classobject(); #13
ArkTaS, открой для себя диспетчеризацию и паттерн посетитель
castaway
18.10.2013, 23:19
  #14

Не по теме:

Про деструктор то я и забыл..

ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
18.10.2013, 23:29  [ТС]     Delete void* p = new classobject(); #15
Может лучше в виде шаблона реализовать класс elem?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.10.2013, 23:35     Delete void* p = new classobject(); #16
Цитата Сообщение от ArkTaS Посмотреть сообщение
Может лучше в виде шаблона реализовать класс elem?
да, и все инстансы шаблона должны наследоватся от базового не шаблонного класса
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
19.10.2013, 00:11  [ТС]     Delete void* p = new classobject(); #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, А нет, я бред написал, так работать не будет... все элементы то разных типов. Что вы все таки имели ввиду ?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.10.2013, 00:11     Delete void* p = new classobject(); #18
ArkTaS, какая цель? написать контейнер который хранит объекты любого типа или написать контейнер который хранит объекты одного типа? если первое то попробуй дописать свой код и ты увидишь что этого
Цитата Сообщение от ArkTaS Посмотреть сообщение
Я представил все в таком образе
недостаточно и тогда читай мою фразу ещё раз
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
19.10.2013, 00:14     Delete void* p = new classobject(); #19
если у тебя будет базовый класс, даже абстрактный, с виртуальным деструктором
ты создаешь дочерний класс приводишь его к базовому
то при удалении сработает деструктор дочернего класса, он же виртуальный
да и new delete себя будут уютней чуствовать
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2013, 00:16     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

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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
19.10.2013, 00:16     Delete void* p = new classobject(); #20
Нельзя в run-time создать заведомо неизвестный тип, поэтому подход к таким манипуляциям реализуется только compile-time подходами.
Yandex
Объявления
19.10.2013, 00:16     Delete void* p = new classobject();
Ответ Создать тему
Опции темы

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