powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Поймать факт перезаписи
25 сообщений из 123, страница 2 из 5
Поймать факт перезаписи
    #38074760
stepplerus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ДохтаР,

"А ларчик просто открывался" (С)

А то - суперуказатели, шарепоинтеры... тьфу!
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074767
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stepplerusДохтаР,

"А ларчик просто открывался" (С)

А то - суперуказатели, шарепоинтеры... тьфу!


В данном случае с ГлобалСторе, да.
А если обьъектов данного типа в программе будет овер 9000 ,
то без вумных указателей задача не такая тривиальная.
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074780
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запретите себе прямую работу с указателями. Сделайте set/get функции для этих указателей. Просто и легко, но требует дисциплины.
Либо изучайте smart pointers + garbage collection.
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074787
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДохтаРОбьявите статическую переменную в struct catcher в которой храните адрес globalStore который вернул
первый вызов new.


компилятор пишет, что войдовые дата-мемберы запрещены стандартом и соотв. про нижние 3 строчки пишет, что переменная автокилл не определена. других ошибок не найдено. как быть??

Код: plaintext
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.
class catcher
{ 
    public:
    static void* autoKill = 0;
    void* operator new(size_t size) 
    { 
        if (autoKill) ::operator delete(autoKill);
        autoKill = ::operator new this;
        return autoKill;
    }
    
};
class user : public catcher
{ 
    public: 
    int a;
    user(int p) { a = p; } 
};
user* globalStore = 0;
int main()
{
    globalStore = new user(5);
    globalStore = new user(6);
    
    return 0;
}
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074803
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix, ты лучше не словами. А копи-пасти выхлоп компиллятора. Те кому надо - разберуться.
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074815
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonLumix, ты лучше не словами. А копи-пасти выхлоп компиллятора. Те кому надо - разберуться.

Я конечно могу, но я думал на этом форуме кидать дамп это моветон...

Там реально ISO forbid void* data member. и больше ничего интересного
а кроме того, приведенный пример является полным, то есть это не кусок из рабочего когда, весь *.cpp файл целиком. Каждый может вырезать его, вставить в пустой файл, скомпилить G++ ом и все увидеть самому.
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074846
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixДохтаРОбьявите статическую переменную в struct catcher в которой храните адрес globalStore который вернул
первый вызов new.


компилятор пишет, что войдовые дата-мемберы запрещены стандартом и соотв. про нижние 3 строчки пишет, что переменная автокилл не определена. других ошибок не найдено. как быть??

Код: plaintext
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.
class catcher
{ 
    public:
    static void* autoKill = 0;
    void* operator new(size_t size) 
    { 
        if (autoKill) ::operator delete(autoKill);
        autoKill = ::operator new this;
        return autoKill;
    }
    
};
class user : public catcher
{ 
    public: 
    int a;
    user(int p) { a = p; } 
};
user* globalStore = 0;
int main()
{
    globalStore = new user(5);
    globalStore = new user(6);
    
    return 0;
}



1 А почему static void* autoKill = 0 ?
Вам известен тип catcher.
Должно быть что то типа :
static catcher* autoKill;
.....
}
......
static catcher::autoKill=NULL;
....
int main(....

2. Зачем
if (autoKill) ::operator delete(autoKill); ?
что бы потом еще раз дернуть алокацию памяти ?
Если есть такое желание затрите память нулями по размеру типа.
пусть остается по тому же адресу.



3 А этого я вобще не понял
operator new this;
Откуда this ?
вы находитесь в статической функции ей фиолетов this.


Кто то был прав , относитльно желания выстрелить в ногу :)
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074871
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДохтаРА почему static void* autoKill = 0 ?

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

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

может есть какой-нибудь способ как положить
новый объект на место старого, а если старого
ещё нет, то создать это место?

Код: plaintext
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.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
#include <iostream>
using namespace std;

class catcher
{ 
    public:
    static catcher*& autoKill;
    void* operator new(size_t size) 
    { 
        autoKill = (catcher*)::operator new(size); // как тут положить объект на место старого
        return autoKill;
    }
    
};

catcher*& catcher::autok = 0; // compile err




class user4b : public catcher
{ 
    public: 
    int a;
    user4b(int p) { a = p; } 
};

class user8b : public user4b
{ 
    public: 
    int b;
    user8b(int p) : user4b(p) { b = p; } 
};




user8b* globalStore = 0;
int main()
{
    user8b* check;
    
    globalStore = new user8b(5);
    check = globalStore;
    
    globalStore = (user8b*) new user4b(6);
    cout << check->a << check->b << endl; // ещё живой!!
    
    return 0;
}





ДохтаР3 А этого я вобще не понял
operator new this;
Откуда this ?
вы находитесь в статической функции ей фиолетов this.


Я только сейчас понял, что она статическая и что ей размер дочек подсовывает компиллер... я думал явно надо указывать объем какого объекта тебе нужен...
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074895
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я прошу прощения , но я в легком шоке от происходящего

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


Ну сделали так и работайте с переменной как со сылкой , а то ссылку сделали , а обращаетесь к ней
как будто она осталась указателем.
Но этот так, лирическое отсутпление , если вы хотите глубже ковырнуть принцип ссылок и указателей.
но лучше уберите ссылку нафик.

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

Не нужно ничего преразмещать ::new () должен вызываться 1 раз,
на входе в оператор вставьте проверку if (autoKill !=NULL ) throw 1 ;
и посмотрите докуда доработает ваша программа.

Она упадет на строчке globalStore = (user8b*) new user4b(6);

Вы ведь этого хотели ?

На какое поведение вам потом менять throw 1 , зависит от логики работы более высокого уровня
, извините телепаты в отпуске.
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074897
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix,

Вы что, в серьез пытаетесь реализовать то что тут вам насоветовали?
Люди развлекаются между прочим.
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074913
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДохтаРНе нужно ничего преразмещать ::new () должен вызываться 1 раз,
на входе в оператор вставьте проверку if (autoKill !=NULL ) throw 1 ;
и посмотрите докуда доработает ваша программа.

Она упадет на строчке globalStore = (user8b*) new user4b(6);



Я сделал как вы сказали + убрал ссылку
Код: plaintext
1.
2.
3.
4.
5.
6.
    void* operator new(size_t size) 
    { 
        if (autok) delete autok;
        autok = (catcher*)::operator new(size);
        return autok;
    }



И у меня теперь все прекрасно компилится и все отлично работает, ничего не падает.
Результат работы программы 65.
6 это от user4b, а 5 от старой user8b
То есть new даже без ссылки отлично перезаписывает на это же самое место!!

Решение получилось супер, но оно синглтоновское...
Теперь я буду думать как это же самое решение замутить для пачек объектов
В этом решении в качестве шины использовалась статическая переменная, а что использовать для пачек... наверное какие-то общие id типа

Код: plaintext
1.
2.
3.
globalStore = new user(id1, 5)
globalStore = new user(id1, 6) // удалит, присвоит
globalStore = new user(id2, 6) // только присвоит



но на это у меня сегодня мозгов уже не хватит))) надо на свежую голову будет подумать

ДохтаР, спасиииибо!!!
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074914
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyLumix,

Люди развлекаются между прочим.

На посты типа "у меня дробовик есть" я внимание особо не обращаю))))
мой вопрос, с которым я сюда обратился РЕШЕН!!
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074916
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixмой вопрос, с которым я сюда обратился РЕШЕН!!
Ну, удачи вам.
Вернее, удачи тем, кто с этим кодом будет после вас работать :)
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074918
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixДохтаРНе нужно ничего преразмещать ::new () должен вызываться 1 раз,
на входе в оператор вставьте проверку if (autoKill !=NULL ) throw 1 ;
и посмотрите докуда доработает ваша программа.

Она упадет на строчке globalStore = (user8b*) new user4b(6);



Я сделал как вы сказали + убрал ссылку
Код: plaintext
1.
2.
3.
4.
5.
6.
    void* operator new(size_t size) 
    { 
        if (autok) delete autok;
        autok = (catcher*)::operator new(size);
        return autok;
    }



И у меня теперь все прекрасно компилится и все отлично работает, ничего не падает.
Результат работы программы 65.
6 это от user4b, а 5 от старой user8b
То есть new даже без ссылки отлично перезаписывает на это же самое место!!

Решение получилось супер, но оно синглтоновское...
Теперь я буду думать как это же самое решение замутить для пачек объектов
В этом решении в качестве шины использовалась статическая переменная, а что использовать для пачек... наверное какие-то общие id типа

Код: plaintext
1.
2.
3.
globalStore = new user(id1, 5)
globalStore = new user(id1, 6) // удалит, присвоит
globalStore = new user(id2, 6) // только присвоит



но на это у меня сегодня мозгов уже не хватит))) надо на свежую голову будет подумать

ДохтаР, спасиииибо!!!

Не торопитесь радоваться удалением и переразмещением
вы попали пальцем в небо.
Положили револьвер со всведенным курком в карман.
Будте внимательны , неострожное движение ,
и случиться то о чем предупреждали на первой странице.

зы Я впролне серьезно.
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38075540
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixможет есть какой-нибудь способ как положить
новый объект на место старого, а если старого
ещё нет, то создать это место?

Это очень похоже на описание работы шаблона "объектный пул". Или пул объектов.
(object pool). Применяется когда конструирование объектов дорого стоит и дешевле
мультиплексировать уже существующие объекты из множества доступных.

Пример - database connection pool.
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38075893
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Lumix]

Можете подсказать как именно построить решение с перегрузкой new / delete конкретно для этого случая?

Чтобы сделать ЧТО ? Ещё раз объясни... Автоматом удалять объекты?


void* operator new(size_t size)
{
// как тут получить доступ к перезаписываемому
// указателю-то??

Никак. Нет тут к нему доступа.

void operator delete(void* obj)
{
::operator delete(obj);

// через что тут обнулять-то??

Не через что. Комментарии ниже.

// ведь операция удаления в самом
// общем виде не обязывает программу
// юзать указатель вообще...

Это я не понял.


Главное:
Пойми одну простую вещь: В С++ создание объекта состоит из выделения объекту памяти и инициализации в ней объекта.
Первое может вообще не происходить, если это глобальный статический или автоматический объект -- память в этом случае выделяется по-другому. Но инициализация не отличается в зависимости от размещения объекта в памяти.

Уничтожение объекта также двухстадийное и тоже независима деинициализация от размещения объекта в памяти.

В случае динамического размещения объекта выделение объекту памяти и освобождение памяти реализуется через operator new / operator delete.
Инициализация объекта и деинициализация реализуются через конструктор и деструктор

Что ты должен был бы понять из вышенаписанного относительно твоих "хотелок":
что ни operator new/delete, ни конструктор с деструктором никак не связаны с организацией автоматического удаления объектов.
Они не могут это реализовать вследствии того, как организована модель памяти в С++ -программе.

Это (garbage collector) должен реализовать какой-то другой класс, внешний по отношению к твоему. И логично это делать сразу для нескольких классов, а не для одного.
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38076298
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЧтобы сделать ЧТО ? Ещё раз объясни... Автоматом удалять объекты?

Удалить объект, который хранится по адресу в ссылке, в которую я хочу создать новый объект
Код: plaintext
1.
2.
3.
A* a = new A;
delete a; // как не писать эту строчку??
a = new A;




void* operator new(size_t size)
{
// как тут получить доступ к перезаписываемому
// указателю-то??

Никак. Нет тут к нему доступа.

ок, понял

void operator delete(void* obj)
{
::operator delete(obj);

// через что тут обнулять-то??

Не через что. Комментарии ниже.

ок, понял

// ведь операция удаления в самом
// общем виде не обязывает программу
// юзать указатель вообще...

Это я не понял.

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

Код: plaintext
1.
2.
3.
A* a = new A;
delete a; // как не писать эту строчку??
a = new A;



вот тут у нас два объекта
они одного типа, но они разные
первый a = 5, второй a = 6
указатель у них один
возникает вопрос как из а = 6 можно узнать, что он перезаписал чей-то чужой указатель и соотв. убить тот объект, который был в том указателе

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


MasterZivГлавное:
Пойми одну простую вещь: В С++ создание объекта состоит из выделения объекту памяти и инициализации в ней объекта.


я бы добавил сюда ещё третий шаг "сохранение адреса в управляющую конструкцию, чтобы всем этим можно было пользоваться", например адрес в указатель


MasterZivПервое может вообще не происходить, если это глобальный статический или автоматический объект -- память в этом случае выделяется по-другому. Но инициализация не отличается в зависимости от размещения объекта в памяти.

для простоты пользователей мы рассматриваем вариант только кучных объектов через new / delete
никаких стеков


MasterZivУничтожение объекта также двухстадийное и тоже независима деинициализация от размещения объекта в памяти.

сложность в том, как организовать связь процессов удаления/создания с процессами контроля управляющих структур (указателей)

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

чтобы пользватель просто вызвал delete b() и у него грамотно сдулась бы вся подсистема, которую он засунул в b()
но про деревья и каскадное убийство это не эта тема, потому что там вопросов нет, там все уже давно реализовано

конкретно эта тема про засовывание в аксессор верхнего уровня нового объекта-предка

Код: plaintext
1.
2.
3.
void stage(A* a);
stage(b());
event15() { b() = new A; }



MasterZivЧто ты должен был бы понять из вышенаписанного относительно твоих "хотелок":
что ни operator new/delete, ни конструктор с деструктором никак не связаны с организацией автоматического удаления объектов.
Они не могут это реализовать вследствии того, как организована модель памяти в С++ -программе.

речь не идет об автоматическом удалении объектов в смысле автоматический поиск, потому что мы не знаем "где, когда и при каких обстоятельства мы потеряли ребенка". речь идет об автоматической зачистке, когда мы точно знаем в какой именно момент и при каком именно действии это происходит: в момент присвоения указателю нового адреса

MasterZivЭто (garbage collector) должен реализовать какой-то другой класс, внешний по отношению к твоему. И логично это делать сразу для нескольких классов, а не для одного.

тема не про GC
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38076316
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixпочему я не люблю умные указатели, потому что они являются объектами и пользователи постоянно путаются , где копия, а где сам объект, а с указателями в этом смысле проще: даже если возникает копия указателя, то сам объект при этом остается сам по себе

Уволить их и все дела.
Данная задача решается только через shared_ptr.
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38076369
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixречь не идет об автоматическом удалении объектов в смысле автоматический поиск, потому что мы не знаем "где, когда и при каких обстоятельства мы потеряли ребенка". речь идет об автоматической зачистке , когда мы точно знаем в какой именно момент и при каком именно действии это происходит: в момент присвоения указателю нового адреса
Как мы можем это знать в рамках С++ ? Ты мог 10 раз его содержимое скопировать в другие указатели.
Кто тебя схватит за руку или запретит это сделать?
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38076408
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКак мы можем это знать в рамках С++ ?

Блин, вообще-то это я с этим вопросом сюда пришел. ))) Если бы я знал, темы бы не было...


maytonКто тебя схватит за руку или запретит это сделать?

Если вы посмотрите как я назвал класс в самом первом примере, то вы поймете, что в своих задумках (ака фантазиях) я планировал, что есть возможность создать некий интерфейс с именем catcher, который и будет хватать за руку...
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38076456
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixпочему я не люблю умные указатели, потому что они являются объектами и пользователи постоянно путаются, где копия, а где сам объект, а с указателями в этом смысле проще:
Проще, если не запутать и их. Вы как раз в этом направлении и двигаетесь упорно ))


Lumixтема не про GC
Был объект. Его дропнули переприсвоением. Возникает желание удалить. Неявно. Разве не простейший GC?


Lumixконкретно эта тема про засовывание в аксессор верхнего уровня нового объекта-предка
Ну и с каких делов объект-предок может решать, можно ли удалять своего коллегу?
Понятно, что в конкретной задаче можно гарантировать отсутствие каких-либо подводных камней. Но это ж не повод нарушать иерархию. Нормальную архитектуру и так сложно поддерживать в процессе разработки, а вы еще и маслица в огонь. Потом конечно "пользователи путаются". Поди разберись кто тут кто и за что отвечает!
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38076465
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.DragonLumixтема не про GC
Был объект. Его дропнули переприсвоением. Возникает желание удалить. Неявно. Разве не простейший GC?
Если отойти в сторону то ОС является простейшим GC. Намусорил в процессе. Процесс вышел
по exit. ОС убрала мусор. Красота? Для простейших няшных ништячков типа sort.exe.
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38076470
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyДанная задача решается только через shared_ptr.

я сделал как вы порекомендовали
все работает!!

только почему-то shared не хочет принимать через равно внутренний объект, переданный ему через указатель... это чё мне перегрузку шареда надо мутить, да??

Код: plaintext
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.
#include <iostream>
#include <boost/shared_ptr.hpp>

using namespace std;
using namespace boost;

class A { public: int a; A() : a(5) {} ~A() { cout << "deadok" << endl; } };

shared_ptr<A> globalStore(new A);
shared_ptr<A> a(bool isNew = false) 
    { return globalStore = (isNew || !globalStore) ? shared_ptr<A>(new A) : globalStore; }
    
int main()
{
    #define pps cout << a()->a << endl;
    pps // 5
    a()->a++;
    pps // 6
    a() = a();
    pps // 6
    a() = a(true);
    pps // 5
    // a() = new A; // как можно сделать чтобы работало так?? вместо = a(true)
   
    return 0;
}
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38076474
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКрасота?
Так и делаем!
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38076489
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.DragonПроще, если не запутать и их. Вы как раз в этом направлении и двигаетесь упорно ))

я наоборот хочу избавить их от всяких концепций shared pointer, о том, что создаются копии на границах вызовов функций и прочих вещей. Пользователи для работы с объектами пользуются только функциями, где любое первое использование создает объект b()->draw() и с new вообще никто не соприкасается ни разу

что касается примеров b() = new A, то это просто заглушка. в реале на уровне пользователя используются только функции b() = a(); и пользователь не должен думать, что же там под капотом происходит и не потечет ли у него что-нибудь...

Edd.DragonБыл объект. Его дропнули переприсвоением. Возникает желание удалить. Неявно. Разве не простейший GC?

И да и нет. ))) На мой взгляд ключевой критерий GC - асинхронность событий: перестал быть нужен и решили удалить, а в случае, который обсуждается в этой теме удаление происходит сразу, как только мы решили его удалить, в данном случае приказом на удаление является присвоение указателя


Edd.DragonНу и с каких делов объект-предок может решать, можно ли удалять своего коллегу?

С очень простых делов: он занял его указатель!! Критерий четко задан. Это и есть условие задачи.
Код: plaintext
1.
2.
3.
A* a = new A;
delete a; // как спрятать эту строчку под капот??
a = new A;




Edd.DragonПонятно, что в конкретной задаче можно гарантировать отсутствие каких-либо подводных камней. Но это ж не повод нарушать иерархию. Нормальную архитектуру и так сложно поддерживать в процессе разработки, а вы еще и маслица в огонь. Потом конечно "пользователи путаются". Поди разберись кто тут кто и за что отвечает!

Имхо в этом абзаце эмоции... Задача-то конкретная. Зачем "мировые" проблемы тут обсуждать?))))
...
Рейтинг: 0 / 0
25 сообщений из 123, страница 2 из 5
Форумы / C++ [игнор отключен] [закрыт для гостей] / Поймать факт перезаписи
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]