1 / 1 / 0
Регистрация: 02.01.2016
Сообщений: 31
|
|||||||||||
1 | |||||||||||
Написал свой string. Проверьте код на наличие подводных камней, утечек памяти и других ошибок29.01.2016, 11:30. Показов 1690. Ответов 20
Метки нет (Все метки)
Сделал класс, который ведет себя аналогично char*, но с возможностью сложения строк. Вроде все работает как надо, но есть ли какие-то подводные камни, утечки памяти? Может что-то сделано криво и можно поумнее? Дело в том, что на этот класс мне надо будет потом полностью полагаться и быть уверенным, что в нем нет ошибок. Вот код:
vstring.h
0
|
29.01.2016, 11:30 | |
Ответы с готовыми решениями:
20
Проверьте код на наличие ошибок. Проверьте пожалуйста код на наличие ошибок Проверьте код программы на наличие ошибок Неверное вычисление выражения: проверьте код на наличие ошибок |
Dimension
594 / 462 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
|
|
29.01.2016, 11:36 | 2 |
это все уже есть в string , зачем свои велосипед делать не понимаю
0
|
1 / 1 / 0
Регистрация: 02.01.2016
Сообщений: 31
|
|
29.01.2016, 11:43 [ТС] | 3 |
Dimension, это для школы, мы там только велосипеды и изобретаем.
0
|
Неэпический
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
29.01.2016, 11:47 | 4 | ||||||||||||||||||||||||||||||||||||||||||||||||||
Сообщение было отмечено gru74ik как решение
Решение
Разве нельзя копировать константную строку?
Думаете, длина строки когда-то будет меньше нуля?
Почему возвращается не ссылка на символ, а копия?
Ну и ссылка в параметре тоже не const почему?
а значит могут быть ошибки потом, которые черт поймаешь. Лучше сделайте функцию-член c_str
если это псевдоним, то почему в объявлении char, а не vchar?
при этом заботу об освобождении возлагаем на клиента? Фигня сразу. И спровоцирует чертову тучу утечек, т.к. неявный каст, см. выше.
Ну тогда хоть в свою функцию всё это дело оберните, а то наплодили один и тот же код в тысячи местах. Не хорошо это Вроде пока всё. Как исправите, приходите
4
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
29.01.2016, 11:49 | 5 |
Ну, написание своих велосипедов - лучший способ обучения.
Касательно самого кода: он у меня даже не компиляется (GCC 4.9), поэтому в дальнейшем анализе на "какие-то подводные камни, утечки памяти" не вижу смысла.
0
|
1 / 1 / 0
Регистрация: 02.01.2016
Сообщений: 31
|
|
29.01.2016, 12:00 [ТС] | 6 |
Croessmah, спасибо, буду исправлять, видите, все же надо иногда учиться на велосипедах.CheshireCat, думаю, это из-за того vchar вместо char (описка) в строке 24 vstring.cpp
0
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
29.01.2016, 12:06 | 7 |
Да, одна из ошибок была именно про vchar. Исправляй, как только код скомпиляется, погляжу более подробно и попробую написать несколько тестов, "ломающих" твой код.
0
|
1 / 1 / 0
Регистрация: 02.01.2016
Сообщений: 31
|
|
29.01.2016, 21:30 [ТС] | 9 |
Если подключить <iostream> в vstring.h и "vstring.h" в vstring.cpp, то у меня на моем vs_2012 все компилится. Ну еще #pragma once можно на всякий. Мой косяк, не знаю, зачем я все это опустил.
0
|
1 / 1 / 0
Регистрация: 02.01.2016
Сообщений: 31
|
|||||||||||
29.01.2016, 23:06 [ТС] | 11 | ||||||||||
ну вот вроде все.
vstring.h
Добавлено через 4 минуты ну пусть подключит стандартные include guardы вместо прагмы.
0
|
Неэпический
|
|||||||||||
29.01.2016, 23:12 | 12 | ||||||||||
Это Ваша задача - Вы же разработчик этого инструмента
0
|
1 / 1 / 0
Регистрация: 02.01.2016
Сообщений: 31
|
||||||
29.01.2016, 23:25 [ТС] | 13 | |||||
вот зачем
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
29.01.2016, 23:34 | 14 |
у вас метод константный.
это значит, что он работает в режиме "только для чтения". но при этом он возвращает мутабельный символ. вы уверены, что это правильно: изменять данные, которые возвращают константные методы? ведь технически, получается, что таким образом можно изменить символ константной от рождения строки, и нарваться на UB Добавлено через 4 минуты привет, говнокод и утечки памяти.
0
|
1 / 1 / 0
Регистрация: 02.01.2016
Сообщений: 31
|
||||||
29.01.2016, 23:36 [ТС] | 15 | |||||
hoggy, я даже не знаю, что такое мутабельный символ. Никаких глубоких рассуждений у меня не было. Я просто не мог вызвать метод вот тут:
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||||||
29.01.2016, 23:39 | 17 | |||||||||||||||
замените:
0
|
1 / 1 / 0
Регистрация: 02.01.2016
Сообщений: 31
|
|
29.01.2016, 23:47 [ТС] | 18 |
hoggy, спасибо, исправил.
Но все же объясните 14-летнему чайнику-говнокодеру, как "ровно" использовать c_str(). Я ж просто хотел возможность преобразовывать в char*. Зачем мне в const char*?
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
29.01.2016, 23:52 | 19 |
вот жеж:
если объект-строка уничтожен, значит данные строки тоже уничтожены. значит любые указатели выданные наружу более не действительные. об этом нужно знать и помнить, когда вы снаружи кэшируете данные во внешних указателях.
0
|
1 / 1 / 0
Регистрация: 02.01.2016
Сообщений: 31
|
|
30.01.2016, 00:03 [ТС] | 20 |
ну а в конструкторах копирования мы ж без сомнений дублируем данные. Почему тогда в них нет таких заморочек?
0
|
30.01.2016, 00:03 | |
30.01.2016, 00:03 | |
Помогаю со студенческими работами здесь
20
Как проверить наличие утечек памяти в шаблоне? Проверьте, на наличие ошибок Проверьте на наличие ошибок Проверьте, пожалуйста, на наличие ошибок Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |