Вопросы по теме 'placement-new'

Деструктор не вызывается после уничтожения объекта.
Я понятия не имел, почему это не работает. Следующий Function создается путем размещения new. Предоставляется функция, которая проверяет, следует ли ее уничтожить, и, если да, вызывает ее деструктор вручную. Вот тестовый пример, где кажется,...
928 просмотров
schedule 30.09.2021

Безопасно ли присвоение перемещения с помощью destruct + move construct?
Вот очень простой способ определить назначение перемещения для большинства классов с помощью конструктора перемещения: class Foo { public: Foo(Foo&& foo); // you still have to write this one Foo&...
670 просмотров

Правильное использование нового размещения и явного вызова деструктора
В недавнем интервью меня попросили ответить, безопасен ли этот код и когда я буду использовать что-то вроде этого: template<class T> T *CTricky<T>::Safe_Or_Not (T *object) { object->T::~T (); ::new (object) T;...
129 просмотров

обработка памяти, возвращаемой оператором new (sizeof (T) * N) как массив
В C можно выделять динамические массивы с помощью malloc(sizeof(T) * N) , а затем использовать арифметику указателей для получения элементов со смещением i в этом динамическом массиве. В C ++ можно сделать то же самое, используя operator new()...
607 просмотров

Новое размещение C++ для локальных объектов
Можно ли использовать placement new для автоматических объектов? Рассмотрим следующий пример: class Button { public: Button() { } virtual ~Button() { } // and a lot of members }; class Screen { public: Screen() { }...
75 просмотров
schedule 24.02.2022

Размещение контейнеров STL новое
Точного ответа на этот вопрос я не нашел, поэтому и пишу здесь. Когда я думаю о векторе, он должен создавать объекты в непрерывной области памяти. Это означает, что вектор сохраняет выделенную память и должен выполнять построение на месте (=...
3187 просмотров
schedule 07.03.2022

Простой класс хранения в C++ и строгое сглаживание
У меня есть следующий код для небольшого класса для хранения. #include <iostream> template<typename T> class storage { private: struct destroy { T& m_t; destroy(T& t) : m_t(t) { } ~destroy() { m_t.~T(); } };...
677 просмотров

Проблемы с размещением нового оператора
Я понимаю, что оператор placement new позволяет создавать объект в определенном/конкретном месте памяти. Итак, я попробовал это; #include <iostream> #include <new> using namespace std; struct Any { int x; string y; }; int...
461 просмотров
schedule 25.04.2022

Размещение новых разрывов, констант и ссылок?
После обсуждения мой ответ на этот вопрос , по-видимому: следующий код разрешен struct Foo { int x; }; Foo f; Foo & f_ref = f; (&f) -> ~Foo (); new (&f) Foo (); int x = f_ref .x; но следующий код запрещен...
849 просмотров
schedule 04.05.2022

Как работает удаление размещения C++ внутри (среда выполнения C++)? Как преодолеть его ограничение?
C++ асимметричен по размещению new и размещению delete. Нам разрешено перегружать размещение new почти произвольным образом. Однако функции удаления места размещения только вызываются из новых выражений места размещения. В частности, они...
389 просмотров

Это неопределенное поведение для инициализации данных перед размещением новых?
struct A { //POD class char data[10]; void print() {std::cout << data;} }; int main() { char buffer[11] = "HELLO"; //sets values in buffer A* a = new(buffer)A; a->print(); // read from memory buffer a->~A(); }...
223 просмотров

Явная установка активного члена в объединении в С++
Следующий код представляет собой классический печально известный союз с каламбуром. Подобный код является допустимым в C99/C11, но недопустимым в C++, потому что нужно читать из неактивного члена. Чтобы активировать неактивный член, нужно написать...
449 просмотров

Срок хранения заменяемого подобъекта
Что касается кода ниже int main() { struct S { int i; } s { 42 }; new (&s.i) int { 43 }; } [basic.stc] / 2 говорит Продолжительность динамического хранения связана с объектами, созданными с помощью нового выражения....
140 просмотров

Создание тривиального базового класса вручную с помощью Placement-new
Осторожно, мы обходим логово дракона. Рассмотрим следующие два класса: struct Base { std::string const *str; }; struct Foo : Base { Foo() { std::cout << *str << "\n"; } }; Как видите, я обращаюсь к...
464 просмотров

Должен ли я использовать новое размещение в операторе присваивания копии
Я создаю дискриминируемый класс, подобный союзу. Я использую С++ 17, поэтому технически я мог бы использовать std::variant , но из-за конкретного варианта использования я хочу, чтобы значение каждого варианта было более явным (особенно потому, что...
160 просмотров
schedule 02.07.2022

Размещение нового в переменных без указателя и членах класса
Рассмотрим следующий пример: #include <iostream> struct A { int i; A(int i) { this->i = i; } A &operator=(const A &a) = delete; A(const A &a) = delete; }; int main() { A a(1);...
269 просмотров
schedule 20.07.2022

Объекты нежити ([basic.life] / 8): почему разрешено повторное связывание ссылок (и модификация констант)?
Оговорка о "нежити" Я называю предложение нежити правилом C ++, согласно которому после уничтожения объекта, если новый объект создается по тому же адресу, его иногда можно рассматривать как тот же объект, что и старый. Это правило всегда...
146 просмотров

размещение нового и частного конструктора
У меня есть собственный распределитель памяти, который использует новое размещение. Затем у меня есть класс с частным конструктором, и когда я пытаюсь использовать свой распределитель памяти, он жалуется на то, что конструктор является частным....
354 просмотров
schedule 11.09.2022

Необработанный буфер собственной карты
Пожалуйста, смотрите код ниже: double* data = new double[100]; boost::shared_ptr<Eigen::VectorXd> rfstdevs = boost::make_shared<Eigen::VectorXd>( Eigen::Map<Eigen::RowVectorXd>(data, 1, 100)); Насколько я понимаю,...
225 просмотров
schedule 01.10.2022

Как работает перегрузка операторов (особенно «новая»)?
Я никогда не понимал, как систематически определяются списки аргументов для перегрузки операторов, и меня особенно смущает проблема, с которой я столкнулся сейчас. Когда вы перегружаете унарный оператор, он имеет один аргумент или ноль, если он...
1085 просмотров