Pokimon
> ушел тестить
аналитически такие вопросы нужно учиться решать
AndryBlack
> аналитически такие вопросы нужно учиться решать
Я и решил.
Используя memcpy я получаю абсолютно идентичный обьект в памяти.
Беда была бы, если бы я его скопировал и использовал бы каждый, но остается же только один. Точно такой-же, какой и был.
Pokimon
> Я и решил.
> Используя memcpy я получаю абсолютно идентичный обьект в памяти.
эхх...
даю еще 5 минут подумать
AndryBlack
> эхх...
> даю еще 5 минут подумать
Моему методу способно помешать только космическое излучение.
AndryBlack
Про ваш класс со строкой.
С копируются m_data и m_length
И ничто не помешает дальше работать с эитим классом как прежде.
Pokimon
> Моему методу способно помешать только космическое излучение.
Упертый или упоротый? в коем веке дядьки программировать решили поучить))) а ты? ))
в data[0] лежит bString { 100, 0x12345 }
0x12345 адрес блока в 100 чаров
memcpy(new_data, data, leangth * sizeof(bStackType));
в new_data[0] тотже bString { 100, 0x12345 }
delete[] data;
вуалябля, в деструкторе bString освободил блок по адресу 0x12345
в new_data[0] bString у которого m_data указывает на освобожденный блок
понятно ?
AndryBlack
> понятно ?
я понял.
У меня же там delete[]. Который вызывает деструкторы из старой памяти. Которые рушат всю задумку.
А что если затереть старую память нулями и после этого вызвать delete[] ?
А есть версия delete что не вызывает их?(самый лучший вариант)
Pokimon
мораль нашего сегодняшнего урока "В общем случае классы нельзя копировать бинарно"
Pokimon
теперь правильно напиши функцию
template <bType> void bCopy(bType* to,const bType* from,size_t amount);
и используй ее
AndryBlack
> мораль нашего сегодняшнего урока "В общем случае классы нельзя копировать
> бинарно"
нет нет.
можно перегрузить глобальный new для своего аллокатора и delete
Но сделать вариант delete (просто функцию) которая не вызывает деструкторы, но корректно удаляет память.
Это будет самый быстрый и лучший вариант.
Почему я не хочу использовать =
Да потому, что в этом операторе может быть все что угодно, включая даже медленные операции вроде выделения памяти.
Спс за урок.
Pokimon
> можно перегрузить глобальный new для своего аллокатора и delete
> Но сделать вариант delete
Полагаю что убеждать тебя что так делать нестоит пустая трата времени?
AndryBlack
> Полагаю что убеждать тебя что так делать нестоит пустая трата времени?
Хотя вы правы. Не нужно связывать свои контейнеры со своими аллокаторами.
Немного напутаны понятия выделенной памяти и объекта (если стек только для POD типов то можно наплевать), если захочешь их разделить, то кроме всего прочего Pop надо будет разделить на Pop и Top. Ну и так по мелочи - дублирование кода в Push и Resize :)
Pokimon
Пустое это всё. Могут быть еще более сложные случаи. Например объект хранит в себе указатель на какое нибудь собственное поле:
class Car
{
int right, left;
int *current; // может указывать на right или на left.
};
ну скопируешь ты его и... сам понимаешь - полноценной копия не будет, current у копии будет указывать в старый объект. косяк налицо и без всяких деструкторов.
для того = и придумали чтобы ты сам не задумывался о таких сложностях.
а тяжеловесность операций - это уже вопрос другой, оптимизационный. у строк, например, неплохо срабатывает ref_count-ный подход, когда строка создаёт новый буфер чаров под себя только если ref_count в нём > 1 и запрашивается операция на запись. иногда просто делают строки константными вообще. по моему C++-ный std::string как раз из таких. Но не уверен. Вот в Яве String - точно из таких. По тем же соображениям. А для интенсивной записи делается StringBuffer.
=A=L=X=
> ну скопируешь ты его и... сам понимаешь - полноценной копия не будет, current у
> копии будет указывать в старый объект. косяк налицо и без всяких деструкторов.
Ты открыл мне глаза! Правда.
gexogen
> Top
В стек можно класть и вынимать.
Что же делает эта функция?
Тема в архиве.