ФлеймФорумПрограммирование

Создан стек (2 стр)

Страницы: 1 2 3 412 Следующая »
#15
20:29, 5 апр 2010

Pokimon
> ушел тестить
аналитически такие вопросы нужно учиться решать

#16
20:40, 5 апр 2010

AndryBlack
> аналитически такие вопросы нужно учиться решать
Я и решил.
Используя memcpy я получаю абсолютно идентичный обьект в памяти.
Беда была бы, если бы я его скопировал и использовал бы каждый, но остается же только один. Точно такой-же, какой и был.

#17
20:42, 5 апр 2010

Pokimon
> Я и решил.
> Используя memcpy я получаю абсолютно идентичный обьект в памяти.
эхх...
даю еще 5 минут подумать

#18
20:44, 5 апр 2010

AndryBlack
> эхх...
> даю еще 5 минут подумать
Моему методу способно помешать только космическое излучение.

#19
20:46, 5 апр 2010

AndryBlack
Про ваш класс со строкой.
С копируются m_data и m_length
И ничто не помешает дальше работать с эитим классом как прежде.

#20
20:49, 5 апр 2010

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 указывает на освобожденный блок

понятно ?

#21
20:58, 5 апр 2010

AndryBlack
> понятно ?
я понял.
У меня же там delete[]. Который вызывает деструкторы из старой памяти. Которые рушат всю задумку.
А что если затереть старую память нулями и после этого вызвать delete[] ?
А есть версия delete что не вызывает их?(самый лучший вариант)

#22
21:03, 5 апр 2010

Pokimon
мораль нашего сегодняшнего урока "В общем случае классы нельзя копировать бинарно"

#23
21:08, 5 апр 2010

Pokimon
теперь правильно напиши функцию

template <bType>
void bCopy(bType* to,const bType* from,size_t amount);

и используй ее

#24
21:09, 5 апр 2010

AndryBlack
> мораль нашего сегодняшнего урока "В общем случае классы нельзя копировать
> бинарно"
нет нет.

можно перегрузить глобальный new для своего аллокатора и delete
Но сделать вариант delete (просто функцию) которая не вызывает деструкторы, но корректно удаляет память.
Это будет самый быстрый и лучший вариант.

Почему я не хочу использовать =
Да потому, что в этом операторе может быть все что угодно, включая даже медленные операции вроде выделения памяти.

Спс за урок.

#25
21:22, 5 апр 2010

Pokimon
> можно перегрузить глобальный new для своего аллокатора и delete
> Но сделать вариант delete
Полагаю что убеждать тебя что так делать нестоит пустая трата времени?

#26
21:39, 5 апр 2010

AndryBlack
> Полагаю что убеждать тебя что так делать нестоит пустая трата времени?
Хотя вы правы. Не нужно связывать свои контейнеры со своими аллокаторами.

#27
21:46, 5 апр 2010

Немного напутаны понятия выделенной памяти и объекта (если стек только для POD типов то можно наплевать), если захочешь их разделить, то кроме всего прочего Pop надо будет разделить на Pop и Top. Ну и так по мелочи - дублирование кода в Push и Resize :)

#28
22:02, 5 апр 2010

Pokimon

Пустое это всё. Могут быть еще более сложные случаи. Например объект хранит в себе указатель на какое нибудь собственное поле:

class Car
{
  int right, left;
  int *current; // может указывать на right или на left.
};

ну скопируешь ты его и... сам понимаешь - полноценной копия не будет, current у копии будет указывать в старый объект. косяк налицо и без всяких деструкторов.
для того = и придумали чтобы ты сам не задумывался о таких сложностях.
а тяжеловесность операций - это уже вопрос другой, оптимизационный. у строк, например, неплохо срабатывает ref_count-ный подход, когда строка создаёт новый буфер чаров под себя только если ref_count в нём > 1 и запрашивается операция на запись. иногда просто делают строки константными вообще. по моему C++-ный std::string как раз из таких. Но не уверен. Вот в Яве String - точно из таких. По тем же соображениям. А для интенсивной записи делается StringBuffer.

#29
22:05, 5 апр 2010

=A=L=X=
> ну скопируешь ты его и... сам понимаешь - полноценной копия не будет, current у
> копии будет указывать в старый объект. косяк налицо и без всяких деструкторов.
Ты открыл мне глаза! Правда.

gexogen
> Top
В стек можно класть и вынимать.
Что же делает эта функция?

Страницы: 1 2 3 412 Следующая »
ФлеймФорумПрограммирование

Тема в архиве.