удаление буфера через другой тип указателя?

Возможно, это может помочь: Advanced Python Scheduler

Вот небольшая часть кода из их документации:

from apscheduler.schedulers.blocking import BlockingScheduler

def some_job():
    print "Decorated job"

scheduler = BlockingScheduler()
scheduler.add_job(some_job, 'interval', hours=1)
scheduler.start()

10
задан mrflash818 24 December 2016 в 01:40
поделиться

10 ответов

Это, как гарантируют, не будет безопасно. Вот необходимая ссылка в облегченном FAQ C++:

[16.13] Я могу отбросить [] при удалении массива некоторого встроенного типа (char, int, и т.д.)?

http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.13

9
ответ дан 3 December 2019 в 17:22
поделиться

Нет, это - неопределенное поведение - компилятор мог правдоподобно сделать что-то другое, и как запись FAQ C++, которую thudbang, связанный с, говорит, operator delete[] мог бы быть перегружен, чтобы сделать что-то другое к operator delete. Можно иногда выходить сухим из воды, но это - также хорошая практика для вырабатывания привычку соответствия, удаляют [] с новым [] для случаев, где Вы не можете.

6
ответ дан 3 December 2019 в 17:22
поделиться

Я высоко сомневаюсь относительно этого.

Существует много сомнительных способов освободить память, например, можно использовать delete на Вашем char массив (а не delete[]) и это будет, вероятно, хорошо работать. Я вел блог подробно об этом (извинения за самоссылку, но это легче, чем перезапись всего этого).

Компилятор не является так проблемой как платформой. Большинство библиотек будет использовать методы назначения базовой операционной системы, что означает, что тот же код мог вести себя по-другому на Mac по сравнению с Windows по сравнению с Linux. Я видел примеры этого, и каждый был сомнительным кодом.

Самый безопасный подход должен всегда выделять и свободная память с помощью совпадающего типа данных. Если Вы выделяете chars и возврат их к другому коду, можно быть более обеспеченным конкретным обеспечением, выделяют/освобождают методы:

SOME_STRUCT* Allocate()
{
    size_t cb; // Initialised to something
    return (SOME_STRUCT*)(new char[cb]);
}

 

void Free(SOME_STRUCT* obj)
{
    delete[] (char*)obj;
}

(Перегрузка new и delete операторы могут также быть опцией, но мне никогда не нравилось делать это.)

4
ответ дан 3 December 2019 в 17:22
поделиться

Стандарт C++ [5.3.5.2] объявляет:

Если операнд имеет тип класса, операнд преобразовывается в тип указателя путем вызова вышеупомянутой функции преобразования, и преобразованный операнд используется вместо исходного операнда для остатка от этого раздела. В любой альтернативе значение операнда удаляет, может быть значение нулевого указателя. Если это не значение нулевого указателя, в первой альтернативе (удалите объект), значение операнда удаляют, будет указатель на объект немассива или указатель на подобъект (1.8) представление базового класса такого объекта (пункт 10). В противном случае поведение не определено. Во второй альтернативе (удаляют массив), значение операнда удаляет, будет значение указателя, которое следовало из предыдущего нового-expression.77 массива), В противном случае, поведение не определено. [Отметьте: это означает, что синтаксис удалять-выражения должен соответствовать типу объекта, выделенного новым, не синтаксисом нового выражения. — заканчивают примечание] [Примечание: указатель на тип константы может быть операндом удалять-выражения; не необходимо выбросить constness (5.2.11) из выражения указателя, прежде чем это будет использоваться в качестве операнда удалять-выражения. — заканчивают примечание]

2
ответ дан 3 December 2019 в 17:22
поделиться

Это - очень похожий вопрос тому, на который я ответил здесь: текст ссылки

Короче говоря, нет, это не безопасно согласно стандарту C++. Если по некоторым причинам Вам нужен объект SOME_STRUCT, выделенный в области памяти, которая имеет различие в размере от size_of(SOME_STRUCT) (и это должно быть больше!), затем Вы - более обеспеченное использование необработанной функции выделения как глобальный operator new выполнить выделение и затем создание экземпляра объекта в необработанной памяти с размещением new. Размещение new будет чрезвычайно дешевым, если тип объекта не будет иметь никакого конструктора.

void* p = ::operator new( cb );
SOME_STRUCT* pSS = new (p) SOME_STRUCT;

// ...

delete pSS;

Это будет работать большую часть времени. Это должно всегда работать если SOME_STRUCT структура POD. Это будет также работать в других случаях если SOME_STRUCTконструктор не бросает и если SOME_STRUCT не имеет пользовательского оператора, удаляют. Эта техника также устраняет необходимость любых бросков.

::operator new и ::operator delete самый близкий эквивалент C++ malloc и free и поскольку их (в отсутствие переопределений класса) называют как соответствующие new и delete выражения они могут (с осторожностью!) использоваться в комбинации.

2
ответ дан 3 December 2019 в 17:22
поделиться

В то время как это должно работать, я не думаю, что можно гарантировать это для сейфа, потому что SOME_STRUCT не является символом* (если это не просто определение типа).

Кроме того, так как Вы используете различные типы ссылок, если Вы продолжите использовать *p доступ, и память была удалена, то Вы получите ошибку периода выполнения.

0
ответ дан 3 December 2019 в 17:22
поделиться

Это будет работать хорошо, если указываемой памятью и указатель, с которым Вы указываете, будет оба POD. В этом случае никакой деструктор не назвали бы во всяком случае, и средство выделения памяти не знает или заботится о типе, сохраненном в памяти.

Единственный случай это соглашается с типами не-POD, то, если пуант является подтипом указателя, (например, Вы указываете на Автомобиль с Механизмом*), и деструктор указателя был объявлен виртуальный.

0
ответ дан 3 December 2019 в 17:22
поделиться

Это не безопасно, и не ответов до сих пор подчеркнули достаточно безумие выполнения этого. Просто не делайте этого, если Вы считаете себя настоящим программистом или когда-нибудь хотите работать профессиональным программистом в команде. Можно только сказать, что структура содержит не деструктор в данный момент, однако Вы кладете противное возможно компилятор и система определенное прерывание для будущего. Кроме того, Ваш код вряд ли будет работать как ожидалось. Самое лучшее, на которое можно надеяться, является этим, не отказывает. Однако я подозреваю, что Вы будете медленно получать утечку памяти, поскольку распределения массива через новый очень часто выделяют дополнительную память в байтах до возвращенного указателя. Вы не будете освобождать память, Вы думаете, что Вы. Хорошая стандартная программа выделения памяти должна взять это несоответствие, как был бы инструменты как Линт и т.д.

Просто не делайте этого и производите чистку от Вашего ума независимо от того, что процесс мышления привел Вас даже рассматривать такую ерунду.

0
ответ дан 3 December 2019 в 17:22
поделиться

Я изменил код для использования malloc/free. В то время как я знаю, как реализации MSVC, новые/удаляющие для простых данных (и SOME_STRUCT в этом случае была структура Win32, так простой C), я просто хотел знать, была ли это портативная техника.

Это не, таким образом, я буду использовать что-то, что является.

0
ответ дан 3 December 2019 в 17:22
поделиться

Если Вы будете использовать malloc/free вместо нового/удалять, то malloc и свободный не будет заботиться о типе.

Таким образом, при использовании подобного C POD (простые данные, как сборка - в типе или структуре), Вы можете malloc некоторый тип, и свободный другой. обратите внимание, что это - плохой стиль, даже если он работает.

0
ответ дан 3 December 2019 в 17:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: