Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.93/14: Рейтинг темы: голосов - 14, средняя оценка - 4.93
1 / 1 / 1
Регистрация: 01.07.2013
Сообщений: 127

Delete void* p = new classobject();

18.10.2013, 21:21. Показов 3457. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.10.2013, 21:21
Ответы с готовыми решениями:

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

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

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

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

Цитата Сообщение от ArkTaS Посмотреть сообщение
Будут ли утечки после освобождения через delete p, без приведения void* к конкретному типу ?
будут
0
1 / 1 / 1
Регистрация: 01.07.2013
Сообщений: 127
18.10.2013, 22:22  [ТС]
Так даже меньше кода
C++
1
2
void* p = new classobject();
delete (classobject*) p;
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
18.10.2013, 22:29
Цитата Сообщение от ArkTaS Посмотреть сообщение
Так даже меньше кода
глупости
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
18.10.2013, 22:31
ArkTaS,
скажи а зачем это надо?
0
1 / 1 / 1
Регистрация: 01.07.2013
Сообщений: 127
18.10.2013, 22:53  [ТС]
ValeryS, Пишу контейнерный класс для хранения разных типов

Добавлено через 3 минуты
Jupiter, В чем же ? Если вы решили что я для развлекухи сворачиваю и разворачиваю тип то это не так.
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
18.10.2013, 22:55
Цитата Сообщение от ArkTaS Посмотреть сообщение
В чем же ? Если вы решили что я для развлекухи сворачиваю и разворачиваю тип то это не так
в с++ это может быть только для развлекухи, шаблоны же есть.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
18.10.2013, 22:55
Цитата Сообщение от ArkTaS Посмотреть сообщение
ValeryS, Пишу контейнерный класс для хранения разных типов
ну и как ты будешь их удалять не зная подо что выделил?
и как себя поведут конструкторы и деструкторы?
может тебе malloc проще использовать
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
18.10.2013, 23:00
Цитата Сообщение от Jupiter Посмотреть сообщение
будут
Разве? По-моему не будут.
0
1 / 1 / 1
Регистрация: 01.07.2013
Сообщений: 127
18.10.2013, 23:06  [ТС]
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
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
18.10.2013, 23:07
Цитата Сообщение от castaway Посмотреть сообщение
Разве? По-моему не будут.
деструктор точно не будет вызван, а если определен явный деструктор(значит его же зачем-то определили, не просто же так) читай у тебя уже что-то утекло
1
1 / 1 / 1
Регистрация: 01.07.2013
Сообщений: 127
18.10.2013, 23:07  [ТС]
castaway,подозреваю что для встроенных типов не будут, а для пользовательских будут
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
18.10.2013, 23:17
ArkTaS, открой для себя диспетчеризацию и паттерн посетитель
1
18.10.2013, 23:19

Не по теме:

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

0
1 / 1 / 1
Регистрация: 01.07.2013
Сообщений: 127
18.10.2013, 23:29  [ТС]
Может лучше в виде шаблона реализовать класс elem?
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
18.10.2013, 23:35
Цитата Сообщение от ArkTaS Посмотреть сообщение
Может лучше в виде шаблона реализовать класс elem?
да, и все инстансы шаблона должны наследоватся от базового не шаблонного класса
0
1 / 1 / 1
Регистрация: 01.07.2013
Сообщений: 127
19.10.2013, 00:11  [ТС]
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
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
19.10.2013, 00:11
ArkTaS, какая цель? написать контейнер который хранит объекты любого типа или написать контейнер который хранит объекты одного типа? если первое то попробуй дописать свой код и ты увидишь что этого
Цитата Сообщение от ArkTaS Посмотреть сообщение
Я представил все в таком образе
недостаточно и тогда читай мою фразу ещё раз
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
19.10.2013, 00:14
если у тебя будет базовый класс, даже абстрактный, с виртуальным деструктором
ты создаешь дочерний класс приводишь его к базовому
то при удалении сработает деструктор дочернего класса, он же виртуальный
да и new delete себя будут уютней чуствовать
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
19.10.2013, 00:16
Нельзя в run-time создать заведомо неизвестный тип, поэтому подход к таким манипуляциям реализуется только compile-time подходами.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.10.2013, 00:16
Помогаю со студенческими работами здесь

Ошибка cannot convert from type void*(classname::) () to type void*(*)(void*)
Подскажите пожалуйста как избавиться от ошибки? Есть ещё какой-либо способ, кроме как объявить thread_func как static? Можно конечно...

Void menu(void); что это ? почему не void menu();
void menu(void); что это ? почему не void menu(); void naprimer(void); и это идет в классе это вообще правильно так писать ?

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

Функция void delete". Требуется идентификатор
В общем, ругается на функцию void delete, не понимаю почему. Помогите исправить. #include &lt;stdio.h&gt; #include &lt;string.h&gt; ...

Ошибка E2044 - operator delete must return void
Среда - С++ Builder 2006 Суть такова: Только начали изучать сишку. Выполняю домашку, нужно составить форму с кнопкой и вычисляемым...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru