![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Хоббит |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1263 Регистрация: 6.11.2005 Репутация: нет Всего: 1 |
Не глубоко разбираюсь с устройством классов stl.
Поэтом спрашиваю. Знаю что нельзя делать так, с классом string и.т.п.
На последней строчке будет segfault. Но не знаю почему. Объясните пожалуйста. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
потому что не произойдет вызов конструктора класса.
по идее, такой способ должен сработать если после выделения памяти вызвать placement-new(правильно написал?). Добавлено через 6 минут и 11 секунд и в добавок, размер строки у тебя 0. по идее ,такой будет валидным. по крайней мере работает. может кто и поправит если ошибаюсь.
http://liveworkspace.org/code/b9708e727b88...3fc29dcf5464798 |
|||
|
||||
| Хоббит |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1263 Регистрация: 6.11.2005 Репутация: нет Всего: 1 |
Почитаю.
Вопрос на ту же тему. А почему в данном случае
Ошибка на последней строке. Уже при удалении. И как необходимо очищать память в этом случае? |
|||
|
||||
| 586 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 10 Всего: 146 |
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| Хоббит |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1263 Регистрация: 6.11.2005 Репутация: нет Всего: 1 |
g++ 4.3.2
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
ошибка на последней строке, или все же на предпоследней?
|
|||
|
||||
| Сыроежка |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: нет Всего: 1 |
Это пример утечки памяти. Сначала вы выделяете память под массив класса std::string. Затем вы этому указателю присваиваете значение адреса строкового литерала. То есть в данном случае значением выражения "abc" является адрес этого строкового литерала. И тем самым вы теряете адрес выделенной памяти. Когда же вы выполняете оператор delete a;, то вы пытаетесь удалить строковый литерал. Это это есть нарушение стандарта. Кроме того строковые литералы могут размещаться в памяти только для чтения. Фактическ, выражение выглядит как string *a; const char *p = "abc"; a = p; Вопрос на самом деле связан с тем, почему у вас компилятор по этому поводу не ругается? Не ругаться он может лишь в одном случае, если у вас создается временный объект std::string на основе данного строкового литерала, и его адрес передается переменной 'a'. Это сообщение отредактировал(а) Сыроежка - 14.7.2011, 18:21 |
|||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
невозможно указателю на объект std::string безопасно присвоить адрес const char*
я начинаю понимать о каком стандарте ты постоянно говоришь. да ты его сам и пишешь! по правилам стандарта, этот код вообще не скомпилиться по причине написанной несколькими строками выше.
занавес и снова занавес! Это сообщение отредактировал(а) boostcoder - 14.7.2011, 18:57 |
||||
|
|||||
| Сыроежка |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: нет Всего: 1 |
||||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
Добавлено @ 18:43 как минимум по той причине, что это разные типы. ну допустим, ты кастанешь... но что после этого станет с a ? выполни этот код:
Это сообщение отредактировал(а) boostcoder - 14.7.2011, 18:46 |
||||
|
|||||
| Сыроежка |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: нет Всего: 1 |
Я и сказал в исходном своем сообщении, что меня удивляет, почему компилятор не выдал сообщения. Так отчего у вас истерика-то? |
|||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
или даже этот. дабы ты понял, что проблема не в том, что a не указывает на реальный объект:
Добавлено через 1 минуту и 12 секунд
тему прочти. я давным-давно раскрыл этот момент. Добавлено через 2 минуты и 46 секунд |
||||
|
|||||
| Сыроежка |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: нет Всего: 1 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |