Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

18.10.2013, 21:21. Просмотров 1723. Ответов 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...

47
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.10.2013, 21:43 #2
Цитата Сообщение от ArkTaS Посмотреть сообщение
Как компилятор узнает сколько памяти нужно освободить ?
в случае с void* компилятор никак не может узнать

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

Добавлено через 3 минуты
Jupiter, В чем же ? Если вы решили что я для развлекухи сворачиваю и разворачиваю тип то это не так.
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.10.2013, 22:55 #7
Цитата Сообщение от ArkTaS Посмотреть сообщение
В чем же ? Если вы решили что я для развлекухи сворачиваю и разворачиваю тип то это не так
в с++ это может быть только для развлекухи, шаблоны же есть.
0
ValeryS
Модератор
6705 / 5114 / 482
Регистрация: 14.02.2011
Сообщений: 17,183
18.10.2013, 22:55 #8
Цитата Сообщение от ArkTaS Посмотреть сообщение
ValeryS, Пишу контейнерный класс для хранения разных типов
ну и как ты будешь их удалять не зная подо что выделил?
и как себя поведут конструкторы и деструкторы?
может тебе malloc проще использовать
0
castaway
Эксперт С++
4887 / 3022 / 370
Регистрация: 10.11.2010
Сообщений: 11,080
Записей в блоге: 10
Завершенные тесты: 1
18.10.2013, 23:00 #9
Цитата Сообщение от Jupiter Посмотреть сообщение
будут
Разве? По-моему не будут.
0
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
18.10.2013, 23:06  [ТС] #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, Или как вариант получил тестовое задание ...
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.10.2013, 23:07 #11
Цитата Сообщение от castaway Посмотреть сообщение
Разве? По-моему не будут.
деструктор точно не будет вызван, а если определен явный деструктор(значит его же зачем-то определили, не просто же так) читай у тебя уже что-то утекло
1
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
18.10.2013, 23:07  [ТС] #12
castaway,подозреваю что для встроенных типов не будут, а для пользовательских будут
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.10.2013, 23:17 #13
ArkTaS, открой для себя диспетчеризацию и паттерн посетитель
1
castaway
18.10.2013, 23:19
  #14

Не по теме:

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

0
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
18.10.2013, 23:29  [ТС] #15
Может лучше в виде шаблона реализовать класс elem?
0
18.10.2013, 23:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.10.2013, 23:29
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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