4 / 3 / 0
Регистрация: 22.08.2014
Сообщений: 80
1

Ошибка в конструкторе класса динамических строк

07.03.2017, 00:28. Показов 529. Ответов 15
Метки нет (Все метки)

Необходимо создать класс динамических строк с конструктором копирования, оператором присваивания, операторами сравнения, операторами ввода-вывода, оператором сложения. При тестировании обнаружил следующие странности:
1) В файле main1.cpp при создании объекта s3 (23 строка) вместо аллокации при вызове оператора "new" происходит переназначение указателя, инкапсулированного в объекте s3, на указатель, из первого элемента вектора. То есть, вместо
C++
1
2
//str объявлен в классе как char *
str = new char[n + 1];
происходит
C++
1
2
//vec объявлен в main1.cpp как vector<my_string>
str = vec[0].str;
2) В файле main2.cpp опять же при создании объекта s3 (28 строка) получаю SIGABRT при вызове оператора "new" в конструкторе.

3) В файле main3.cpp при добавлении объекта в вектор (30 строка) получаю SIGABRT при вызове оператора "new" в конструкторе копирования.

Кто-нибудь может подсказать, в чём может быть проблема? Компилирую GCC (версия - Ubuntu 5.4.1-2ubuntu1~14.04) с ключами -std=c++11 и -Wall.
Вложения
Тип файла: rar my_string.rar (2.4 Кб, 3 просмотров)
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.03.2017, 00:28
Ответы с готовыми решениями:

Два динамических массива в конструкторе класса
Доброго времени суток Вам!) Есть такая проблема, ни как не могу создать сразу два динамических...

Ошибка при работе с объектом класса в конструкторе другого класса
Имеется данный код: https://github.com/ubelian/glgame/tree/master/glgame В файле Food.cpp в...

Ошибка в конструкторе класса
Всем доброго времени суток! Есть простая задачка: Написать реализацию класса и короткую...

Ошибка в объявлении класса (в конструкторе)
Я не могу разобраться с классами и конструкторами, в строчке Progect();// {numb=0; sum=0;...

15
nd2
3426 / 2805 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
07.03.2017, 00:47 2
C++
1
2
3
4
5
6
my_string::my_string()
        :size(13)
{
    str = new char[14];
    std::strcpy(str, "Hello, world!\0");
}
Сколько, по-твоему, символов в строке, которую здесь копируешь?
0
4 / 3 / 0
Регистрация: 22.08.2014
Сообщений: 80
07.03.2017, 00:53  [ТС] 3
14 вместе с нуль-символом
0
nd2
3426 / 2805 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
07.03.2017, 00:59 4
Цитата Сообщение от VergilYamato Посмотреть сообщение
14 вместе с нуль-символом
15, вместе с '\0'. Вот так будет 14, вместе с '\0':
C++
1
std::strcpy(str, "Hello, world!");
Добавлено через 1 минуту
Не нужно специально добавлять '\0' к строковому литералу, он и так там есть.
1
4 / 3 / 0
Регистрация: 22.08.2014
Сообщений: 80
07.03.2017, 01:03  [ТС] 5
А разве strcpy не останавливается на '\0'? Как он тогда узнает, когда ему останавливаться?
0
nd2
3426 / 2805 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
07.03.2017, 01:05 6
Цитата Сообщение от VergilYamato Посмотреть сообщение
Как он тогда узнает, когда ему останавливаться?
...
Цитата Сообщение от nd2 Посмотреть сообщение
Не нужно специально добавлять '\0' к строковому литералу, он и так там есть.
0
4 / 3 / 0
Регистрация: 22.08.2014
Сообщений: 80
07.03.2017, 01:11  [ТС] 7
Спасибо, исправил. К сожалению, проблему это не решило.
0
nd2
3426 / 2805 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
07.03.2017, 01:13 8
Цитата Сообщение от VergilYamato Посмотреть сообщение
К сожалению, проблему это не решило.
Никто и не обещал. На одну ошибку стало меньше. Тебе зачем три файла с main()?
0
4 / 3 / 0
Регистрация: 22.08.2014
Сообщений: 80
07.03.2017, 01:24  [ТС] 9
Я это для наглядности здесь сделал: вместо того, чтобы объяснять, какой код для получения какой ошибки нужно закомментировать, а какой - наоборот - просто по main на ситуацию. Я их, само собой, вместе не компилирую.
0
nd2
3426 / 2805 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
07.03.2017, 01:26 10
А адреса объектов зачем тебе?
0
4 / 3 / 0
Регистрация: 22.08.2014
Сообщений: 80
07.03.2017, 01:32  [ТС] 11
Я когда заметил, что первый элемент в векторе изменяется, сразу подумал, что где-то с указателями напортачил (одна из самых частых ошибок плюсов, как ни крути). Правда, всё оказалось куда хитрее.
0
nd2
3426 / 2805 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
07.03.2017, 01:57 12
То, что ты писал про main1, этого сейчас не вижу, но сортировку не проходит, где-то память портится, где не пойму.
0
4 / 3 / 0
Регистрация: 22.08.2014
Сообщений: 80
07.03.2017, 02:03  [ТС] 13
А отладчика нет под рукой? По крайней мере сортировка у меня работает.
0
nd2
3426 / 2805 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
07.03.2017, 02:06 14
Нашёл ещё одну ошибку, из-за которой у меня сортировка не проходила: в операторе присваивания новую память не выделяешь:
C++
1
2
3
4
5
6
7
8
9
my_string & my_string::operator=(const my_string &s)
{
    if(this == &s)
        return *this;
    delete [] str;
    std::strcpy(str, s.str);
    size = s.size;
    return *this;
}
Сначала delete делаешь, потом туда копируешь.
1
4 / 3 / 0
Регистрация: 22.08.2014
Сообщений: 80
07.03.2017, 02:21  [ТС] 15
Хм. У тебя не msvc, случаем? У меня с GCC почему-то всё работало и до этого. Но в любом случае, спасибо, что подсказал.
0
nd2
3426 / 2805 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
07.03.2017, 02:35 16
Цитата Сообщение от VergilYamato Посмотреть сообщение
У меня с GCC почему-то всё работало и до этого.
Работало, но криво, иначе бы и темы не было. Есть известное утверждение: если код работает, это вовсе не значит, что в нём отсутствуют ошибки.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.03.2017, 02:35
Помогаю со студенческими работами здесь

Ошибка в конструкторе копирования класса
Хотя и делал по образцу, но почему то лезет ошибка записи за пределы динамического массива, хотя и...

Ошибка при открытии класса в конструкторе
Подскажите пжлст. Написал форму со всеми объектами и событиями. После создал наследника этого...

Инициализация шаблонного класса(В конструкторе класса после двоеточия вновь имя класса)
Всем доброго времени суток! Пытаюсь разобраться как работает приведенный мной код. Конкретно,...

С++, delete в деструкторе класса не видит переменные, создаваемые new в конструкторе класса
#include &quot;stdafx.h&quot; #include &quot;iostream&quot; #include &quot;math.h&quot; using namespace std; class fun {...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru