kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 Thomi
Thomi
Вопрос

Как предотвратить создание объекта на куче?

Кто-нибудь знает, как я могу в платформенно-независимом коде C++ предотвратить создание объекта на куче? То есть, для класса "Foo" я хочу запретить пользователям делать это:

Foo *ptr = new Foo;

и разрешить им делать только это:

Foo myfooObject;

Есть ли у кого-нибудь идеи?

Будьте здоровы,

26 2008-08-14T13:19:08+00:00 9
 SCFrench
SCFrench
Редактировал вопрос 15-го июня 2016 в 2:16
Программирование
c++
stack
heap
Решение / Ответ
Patrick Johnmeyer
Patrick Johnmeyer
14-го августа 2008 в 4:36
2008-08-14T16:36:41+00:00
Дополнительно
Источник
Редактировать
#8414860

[Nick' s ответ] (https://stackoverflow.com/questions/10985/how-to-prevent-an-object-being-created-on-the-heap#11003) хорошая отправная точка, но неполный, поскольку Вы на самом деле должны перегрузить:

private:
    void* operator new(size_t);          // standard new
    void* operator new(size_t, void*);   // placement new
    void* operator new[](size_t);        // array new
    void* operator new[](size_t, void*); // placement array new

(Хорошая кодирующая практика предложила бы, чтобы Вы также перегрузили удаление и удалить [] операторов - я был бы, но с тех пор they' ре, не собирающееся быть названным этим isn' t действительно необходимый.)

[Pauldoo] (https://stackoverflow.com/questions/10985/how-to-prevent-an-object-being-created-on-the-heap#11018) также правилен что этот doesn' t переживают соединение на Фу, хотя оно действительно переживает наследование от Фу. Вы могли сделать некоторое метапрограммное волшебство шаблона ПОМОЧЬ предотвратить это, но это не будет неуязвимо для " зло users" и таким образом вероятно, не стоит осложнения. Документация того, как это должно использоваться, и кодовый обзор, чтобы гарантировать его, используется правильно, путь на только ~100%.

 Community
Community
Редактировал ответ 23-го мая 2017 в 12:02
25
0
 Nick
Nick
14-го августа 2008 в 1:31
2008-08-14T13:31:05+00:00
Дополнительно
Источник
Редактировать
#8414854

Вы можете перегрузить new для Foo и сделать его приватным. Это означает, что компилятор будет стонать... если только вы не создаете экземпляр Foo на куче изнутри Foo. Чтобы поймать этот случай, вы можете просто не писать метод new для Foo, и тогда компоновщик будет стонать о неопределенных символах.

class Foo {
private:
  void* operator new(size_t size);
};

PS. Да, я знаю, что это можно легко обойти. Я действительно не рекомендую это - я думаю, что это плохая идея - я просто ответил на вопрос! ;-)

 Nick
Nick
Редактировал ответ 14-го августа 2008 в 2:04
9
0
 pauldoo
pauldoo
14-го августа 2008 в 1:37
2008-08-14T13:37:17+00:00
Дополнительно
Источник
Редактировать
#8414857

Я don' t знают, как сделать это надежно и портативным способом.. но..

Если объект находится на стеке тогда, Вы могли бы быть в состоянии утверждать в конструкторе что ценность ' this' всегда близко к указателю стека. There' s хороший шанс, что объект будет на стеке, если это верно.

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

FooClass::FooClass() {
    char dummy;
    ptrdiff_t displacement = &dummy - reinterpret_cast<char*>(this);
    if (displacement > 10000 || displacement < -10000) {
        throw "Not on the stack - maybe..";
    }
}
 pauldoo
pauldoo
Редактировал ответ 14-го августа 2008 в 1:40
7
0
 pauldoo
pauldoo
14-го августа 2008 в 1:39
2008-08-14T13:39:54+00:00
Дополнительно
Источник
Редактировать
#8414858

[Ник] (#11003)

Это могло обойтись, создав класс, который происходит из или совокупности Фу. Я думаю, что я предлагаю (в то время как не прочный), все еще работал бы на полученные и соединяющиеся классы.

Например:

struct MyStruct {
    Foo m_foo;
};

MyStruct* p = new MyStruct();

Здесь я создал случай ' Foo' на куче, обходя Foo' s скрытый новый оператор.

 pauldoo
pauldoo
Редактировал ответ 14-го августа 2008 в 1:52
3
0
 MerkX
MerkX
26-го мая 2016 в 10:34
2016-05-26T22:34:20+00:00
Дополнительно
Источник
Редактировать
#8414861

Поскольку заголовки отладки могут отвергнуть оператора новая подпись, лучше использовать... подписи как полное средство:

private:
void* operator new(size_t, ...) = delete;
void* operator new[](size_t, ...) = delete;
2
0
 Bala
Bala
20-го января 2018 в 5:52
2018-01-20T17:52:31+00:00
Дополнительно
Источник
Редактировать
#8414862

это может быть предотвращено, делая конструкторов частными и обеспечивая статическому участнику, чтобы создать объект в стеке

Class Foo
{
    private:
        Foo();
        Foo(Foo& );
    public:
        static Foo GenerateInstance() { 
            Foo a ; return a; 
        }
}

это будет делать создание объекта всегда в стеке.

Waleed Iqbal
Waleed Iqbal
Редактировал ответ 20-го января 2018 в 8:11
0
0
angry person
angry person
14-го августа 2008 в 1:41
2008-08-14T13:41:58+00:00
Дополнительно
Источник
Редактировать
#8414859

Вы могли объявить его как интерфейс и управлять классом внедрения более непосредственно из Вашего собственного кодекса.

0
0
 David
David
14-го августа 2008 в 1:28
2008-08-14T13:28:17+00:00
Дополнительно
Источник
Редактировать
#8414853

Вы можете объявить функцию "operator new" внутри класса Foo, которая будет блокировать доступ к обычной форме new.

Вы хотите именно такого поведения?

0
0
Will Dean
Will Dean
14-го августа 2008 в 1:35
2008-08-14T13:35:29+00:00
Дополнительно
Источник
Редактировать
#8414856

Не уверен, что это дает какие-либо возможности во время компиляции, но не рассматривали ли вы возможность перегрузки оператора 'new' для вашего класса?

-1
0
Похожие сообщества 9
pro.cxx
pro.cxx
5 960 пользователей
C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. No Ads, offtop, flood 2. Полные правила тут https://t.me/ProCxx/259155 Объявления о вакансиях,эвентах - в лс @AlexFails или @MasterZiV
Открыть telegram
supapro.cxx
supapro.cxx
4 991 пользователей
Чат для тех, кто немного знает C++, простые вопросы по C++, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат-флудилка — @fludpac /прогерские вопросы – @pro_prog 🚫flood, pron, spam; ✅УВАЖАЙТЕ ДРУГ ДРУГА!
Открыть telegram
Хирьянов Т.Ф., Алгоритмы и структуры данных (С++)
Хирьянов Т.Ф., Алгоритмы и структуры данных (С++)
1 393 пользователей
Лекции: www.youtube.com/playlist?list=PLRDzFCPr95fL_5Xvnufpwj2uYZnZBBnsr Практика: cs.mipt.ru/cpp_algo Спонсировать: www.paypal.me/tkhirianov Онлайн компилятор https://godbolt.org
Открыть telegram
Чат конференции C++ Russia
Чат конференции C++ Russia
1 205 пользователей
Канал конференции: @cpprussia_channel Ближайшая конференция — C++ Russia 2023, 11–12 мая · Online Оффлайн — 23–24 мая · Москва Билеты: https://tinyurl.com/CPPRussia2023 Саппорт: @JUGConfSupport_bot
Открыть telegram
Android NDK (C++) — русскоговорящее сообщество
Android NDK (C++) — русскоговорящее сообщество
783 пользователей
Общаемся на темы, посвященным Android-разработке на C++. Обмен новостями, опытом и наработками. + Про Android: @android_ru + Про iOS: @ios_ru + Канал Android: @pandroidtoday_ru + Вакансии: @mobile_jobs Рекомендуем отключить уведомления.
Открыть telegram
C++ для самых маленьких и отчаяных
C++ для самых маленьких и отчаяных
564 пользователей
Лоу левел (по среднему IQ участников) чатик По продвижению вакансий писать @vertver Флудилка чата - @hckcxx
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 2 дня назад
2
Денис Васьков
Зарегистрирован 3 дня назад
3
Dima Patrushev
Зарегистрирован 6 дней назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
ID
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией