Форум программистов, компьютерный форум CyberForum.ru

С++ идиомы - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Внедрение DLL в EXE http://www.cyberforum.ru/cpp/thread1787895.html
Здравствуйте, хочу написать свой объединитель exe и dll. Подскажите, как это можно сделать так, чтобы можно было при запуске использовать dll без записи на диск
C++ Как создать оконную программу на c++ exe Можно по подробние как создать оконную программу на c++ exe . Я только что перешол на c++ из Bash (cmd , bat , командная строка ) и как то не хочется опять возвращатся к консольным программам . Я незнаю еще не каких команд для C++ и не знаю не каких компеляторов но хотелось бы создать хотяюы самую простую оконную программу без всяких функций что бы просто открылось пустое окно . Вы поможите ? И... http://www.cyberforum.ru/cpp/thread1787737.html
Парсинг журнала событий C++
возникла задача, получить некоторые данные из event log'a Windows, как это все реализовать ? с чего начать?
Не выделяется память C++
Здравствуйте, пытаюсь выделить память, на одном компьютере работает, на другом нет, возвращает 0x00000000, хотя память имеется в наличии. В чём может быть причина? size_t size = 1586753967; void* b = malloc(size); free(b); Добавлено через 6 минут errno = ENOMEM, хотя памяти доступно 4,2 ГБ Добавлено через 2 минуты
C++ Стек и куча http://www.cyberforum.ru/cpp/thread1786739.html
Вот говорят, что для стека доступного места меньше, чем для кучи. И если есть много переменных большого размера, то лучше создавать их через new. а почему так?
C++ Программа для отправки сообщения Привет всем. Может кто помочь? Задача следующая. Есть сервер, к которому подключается 10 человек. На этом сервере лежат 10 именных папок (по имени участника). Когда кто-то один из участников перекидывает со своей папки второму участнику, то в это время второму участнику должно автоматически прийти сообщение на почту, что "в такое время, такой участник перекинул вам файл." Как можно сделать... подробнее

Показать сообщение отдельно
HelicopterK52
658 / 201 / 28
Регистрация: 27.07.2016
Сообщений: 475
Завершенные тесты: 1
01.08.2016, 20:51     С++ идиомы
Checked delete

Цель:
Повышение безопасности при использовании delete expression.

Мотивация и пример проблемного кода:
Стандарт C++ (пункт 5.3.5/5) позволяет использовать в delete-expression указатель на не полный тип, но при этом, если деструктор или функция освобождения памяти объекта не являются тривиальными, то это приведет к неопределенному поведению.
Цитата Сообщение от 5.3.5/5
If the object being deleted has incomplete class type at the point of deletion and the complete class has a non-trivial destructor or a deallocation function, the behavior is undefined.
Некоторые компиляторы в таком случае выдают предупреждение, но могут этого и не сделать, либо программист может игнорировать или отключить предупреждения.

В следующем примере в main.cpp определяется объект типа Object. В функции main() вызывается функция delete_object(), определенная в deleter.cpp, где нет определения класса Object, а есть лишь его объявление.
Вызов delete в данной функции приводит к неопределенному поведению.
C++
1
2
3
4
5
6
////////////////////
// File: deleter.hpp
////////////////////
// Объявляем Object, но не определяем его
struct Object;
void delete_object(Object* p);
C++
1
2
3
4
5
6
7
////////////////////
// File: deleter.cpp
////////////////////
#include "deleter.hpp"
 
// Удаляем объект типа Object, не имея его определения
void delete_object(Object* p) { delete p; }
C++
1
2
3
4
5
6
7
8
9
10
11
////////////////////
// File: object.hpp
////////////////////
struct Object
{
  //Этот деструктор не будет вызван при удалении, 
  //если не будет определения типа при вызове delete
  ~Object() {
     // ...
  }
};
C++
1
2
3
4
5
6
7
8
9
10
////////////////////
// File: main.cpp
////////////////////
#include "deleter.hpp"
#include "object.hpp"
 
int main() {
  Object* p = new Object;
  delete_object(p);
}
Решение и пример кода:
Идиома checked delete полагается на вызов шаблонной функции для удаления объекта, а не на прямой вызов delete, который может привести к неопределенному поведению для объявленных, но неопределенных типов.
Ниже приводится реализация шаблонна функции boost::checked_delete из Boost Utility library.
Её использование вызывает ошибку компиляции при использовании sizeof для параметра шаблона T, если T - не полный тип.
Если T объявлен, но не определен, то sizeof(T) будет генерировать ошибку компиляции или возвращать нулевое значение, в зависимости от компилятора.
Если sizeof(T) вернет ноль, то произойдет ошибка компиляции, т.к. объявляется массив с отрицательным количеством элементов (-1). Имя type_must_be_complete в данном случае появляется в сообщении об ошибке и позволяет понять что произошло.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template<class T> 
inline void checked_delete(T * x)
{
    typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
    (void) sizeof(type_must_be_complete);
    delete x;
}
template<class T> 
struct checked_deleter : std::unary_function <T *, void>
{
    void operator()(T * x) const
    {
        boost::checked_delete(x);
    }
};
Примечание: этот метод также применим к delete[].

Предупреждение: std::auto_ptr не использует никакого эквивалента checked delete. Поэтому инстанцирование std::auto_ptr с неполным типом может привести к неопределенному поведению в деструкторе, если в момент объявления std::auto_ptr тип параметра шаблона определен не полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru