Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677

Как определить, является ли переменная встроенным массивом?

01.05.2017, 01:34. Показов 4132. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, прошу прощения за странное название темы, никак в голову ничего не влезет путного.

Сразу к делу.

Есть функция шаблонная. В ней я бы хотел определить, является ли тип параметра встроенным массивом чего-либо.

Вот:
C++
1
2
3
4
5
6
7
8
9
10
template <typename Type>
void defaultDelFunc(Type* ptr)
{
    if (ptr == nullptr)
    {
        return;
    }
 
    delete ptr;
}
Я хочу вместо delete ptr; иметь еще возможность delete[] ptr;, но не знаю, чего сделать, чтобы выявить, указывает ли ptr на массив Type или просто на переменную.

Короче, мне надо отличать Type[]* от Type*.

Я думал об извлечении базового класса у ptr и сравнением typeid() извлеченного типа с typeid(Type[]), но не знаю, как это даже сделать.

Есть ли для моих целей что-нибудь удобное и (желательно) элегантное? Если есть, напишите, пожалуйста.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.05.2017, 01:34
Ответы с готовыми решениями:

Является ли переменная массивом?
Как можно определить является ли переменная массивом? В PHP есть функция is_array. Есть ли в java чтото подобное?

Почему переменная не является массивом
Есть файл php с формой &lt;? include (&quot;function.php&quot;) ?&gt; &lt;form method=&quot;get&quot;&gt; &lt;div class=&quot;menu&quot;&gt; ...

Как определить, является ли переменная целым числом
Доброй ночи! Есть функция матлаб чтобы определить является ли переменная целым числом, что-нибудь вроде isnun или isempty ? clear ...

27
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
01.05.2017, 02:21
Студворк — интернет-сервис помощи студентам
Да. Я фигню предложил.
0
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
01.05.2017, 02:25  [ТС]
Цитата Сообщение от Max Dark Посмотреть сообщение
а так он вызовет delete ptr;
Хм, значит я где-то невнимательно прочитал. Я думал они сами определяют, массив или нет. Спасибо

Добавлено через 2 минуты
Цитата Сообщение от Max Dark Посмотреть сообщение
а так он вызовет delete ptr;
Но ведь будет утечка памяти в таком случае, верно?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.05.2017, 02:26
Цитата Сообщение от meJevin Посмотреть сообщение
Есть ли информация по поводу того, что у них там? Очень интересно.
да. есть.
при условии, что изначальный захват ресурсов
был выполнен руками std::make_shared
в этом случае будет задействан паттерн type erasure.
смарт будет "помнить" настоящий тип захваченного ресурса.

http://rextester.com/DXYLI50335

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
#include <iostream>
#include <memory>
 
 
struct base
{
    ~base(){} // <--- забыли сделать вирт. диструктор
    
    void virtual foo()const = 0;
};
 
 
struct der: base
{
    ~der(){ std::cout << "der::~der();\n"; }
    
    void virtual foo()const { std::cout << "der::foo();\n"; }
};
 
int main()
{
    std::shared_ptr<base> smart = std::make_shared<der>();
    
    //
    // несмотря на то, что в базовом классе диструктор не виртуальный
    // тем не менее смарт-поинтер кррректно 
    // запустит деструктор наследника при разрушении
    //
    // он может это сделать благодаря тому
    // что в момент захвата ресурса
    // смарт "запомнил" фактический тип наследника
    //
    
}
1
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
01.05.2017, 02:28  [ТС]
Цитата Сообщение от meJevin Посмотреть сообщение
Но ведь будет утечка памяти в таком случае, верно?
Сейчас проверил, утечки нету, похоже. Странно, мне казалось delete просто освободит память, выделенную под одну int, а другие оставит. delete[] же под все.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.05.2017, 02:29
Цитата Сообщение от meJevin Посмотреть сообщение
delete 0 аж мурашки по коже) Это ж UB
это не UB.

ваши проверки:

C++
1
2
if(!p)
    delete p;
избыточны.
можно просто сделать delete p;
результат будет тот же.
но без лишней проверки.
0
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
01.05.2017, 02:49  [ТС]
hoggy, да, я понял. Я перепутал удаление ничего с удалением указателя, указывающего на уже удаленную память.

Добавлено через 16 минут
Цитата Сообщение от hoggy Посмотреть сообщение
//
* * // несмотря на то, что в базовом классе диструктор не виртуальный
* * // тем не менее смарт-поинтер кррректно
* * // запустит деструктор наследника при разрушении
* * //
фига
0
 Аватар для GoldenId
142 / 143 / 64
Регистрация: 11.11.2010
Сообщений: 877
Записей в блоге: 10
04.05.2017, 12:42
В этой теме столько говорилось, что определить, является ли тип встроенным массивом невозможно, а как же type_trait is_array?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
04.05.2017, 12:45
Цитата Сообщение от GoldenId Посмотреть сообщение
а как же type_trait is_array?
Цитата Сообщение от meJevin Посмотреть сообщение
void defaultDelFunc(Type* ptr)
Цитата Сообщение от meJevin Посмотреть сообщение
Type* ptr
Цитата Сообщение от meJevin Посмотреть сообщение
Type*
никак.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.05.2017, 12:45

Определить, является ли переменная числом
Всем доброго времени суток! У меня возникла такая проблема.... как проверить переменную ли является она числом! Задание таково......

Как проверить, является ли переменная числом
Есть структура точки struct Point { double x; double y; }; Есть вектор из структур vector&lt;Point&gt; V; Считывание...

Как проверить, что переменная является числом?
Добрый день, уважаемые. Скучая на работе и просто решив побаловаться BAT, я написал небольшой скрипт, который производит перезагрузку...

Как прописать функцию определяющую является ли переменная списком или нет ?
День добрый, как написать функцию, которая возвращает true если переменная является списком, а если нет то возвращает false. Использовать...

Как записать в переменную Array элемент массива, который в свою очередь так же является массивом
Вот часть кода. Array sim = new Array; for (int i = 0; i &lt;= slova.Length - 1; i++) { if...


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. https:/ / youtu. be/ VpfFZSUDGnQ. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru