1 / 1 / 1
Регистрация: 31.12.2016
Сообщений: 8
|
||||||
1 | ||||||
Работа с памятью02.02.2017, 20:09. Показов 1399. Ответов 3
Метки нет Все метки)
(
Форумчане, доброго времени суток.
Заранее извиняюсь за нубские вопросы, но должен разобраться в теме. Суть такова: написал class String, в нем реализовал метод превращения двух строк в одну. Попутно ради практики использовал указатель this, и вроде понял, для чего он нужен - для того, чтобы компилятор не путал аргументы, передаваемые в метод и то, что находится в полях класса (поправьте, если ошибаюсь). Непосредственно вопрос: У меня в коде 2 раза выделяется память, освобождается же 1, в деструкторе прописана команда. Так и должно быть, или это не норма? Если норма - прошу объяснить почему. Так же буду крайне признателен за конструктивную критику кода и самой реализации.
0
|
|
02.02.2017, 20:09 | |
Ответы с готовыми решениями:
3
Работа с памятью работа с памятью Работа с памятью Работа с памятью |
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
|
|
02.02.2017, 21:24 | 2 |
Я вижу два вызова delete: в 58 и 65 строках.
На сколько я вижу, в конце строки не хранится нулевой байт. А значит, выдавать такую строку во внешний мир бессмысленно/небезопасно. В частности, в 74 строке кроме "Hello, world!" будет напечатан какой-то мусор. Поэтому лучше потратить лишний байт и записать в него признак конца строки.
1
|
1 / 1 / 1
Регистрация: 31.12.2016
Сообщений: 8
|
|
02.02.2017, 23:40 [ТС] | 3 |
Значит я не совсем правильно выразился, память выделяется еще в 38 строке, получается 3 раза. Я просто не акцентировал на этом внимание, т.к освобождается она сразу в этом методе. Интересует переменная str, для неё я выделил память в 28 и 46 строках. Потом она освобождается в деструкторе один раз. Это норма?))
За замечание спасибо. UPD: Нулевой байт нужно добавить в вызов метода .append в 74 строке? (Присобачить его к World?) К слову, когда компилировал код, выводилась только строка, никакого мусора
0
|
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
|
||||||
03.02.2017, 11:27 | 4 | |||||
![]() Решение
Действительно, что-то я не заметил в первый раз, невнимательно смотрел.
Теперь заметил, что в 46 строке будет утечка памяти: мы меняем указатель this->str , не удалив память, на которую он указывал.Тут уж как повезёт. Если в конце программы добавить строку cout << str_1.append(" Another string."); , то у меня программа вообще падает.Привожу свою реализацию, не меняющую интерфейс класса:
0
|
03.02.2017, 11:27 | |
03.02.2017, 11:27 | |
Помогаю со студенческими работами здесь
4
Работа с памятью Работа с памятью в С++ Работа с памятью Работа с памятью Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |