Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
1 / 1 / 0
Регистрация: 07.08.2014
Сообщений: 72

Ошибка при перегрузке оператора +

07.09.2016, 23:34. Показов 2086. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется класс, который представляет из себя строку и количество символов в ней. Задача - перегрузить оператор +, чтобы он складывал нам две строки и выдавал третью. Сделал я, по советам местных форумчан, это так:
C++
1
2
3
4
5
6
7
8
9
String operator+(String & a, String & b)
{
    String c;
    c.i = a.i + b.i;
    c.p = new char[c.i + 1];
    strcat(c.p, a.p);
    strcat(c.p + a.i, b.p);
    return c;
}
i - это размер строки
p - указатель на char
delete присутствует в деструкторе.

Но при выполнении программы вылезает ошибка:
"Возникло необработанное исключение по адресу 0x76F5C41F в Проект4.exe: исключение Microsoft C++: std::bad_alloc по адресу памяти 0x0043FA0C."
В чем может быть проблема, потому что все остальное работает нормально, но вот со сложением объектов такая беда. Могу предоставить остальной код, если надо, просто он большой и размещен в трех файлах. Заранее спасибо.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.09.2016, 23:34
Ответы с готовыми решениями:

Ошибка при перегрузке оператора >>
Приветствую. Есть 2 класса: enum Color { white = 1, red, green, blue, yellow }; class Shape { protected: Color figureCol; ...

Ошибка при перегрузке оператора ==
У меня компилятор выдает ошибку error LNK2019: ссылка на неразрешенный внешний символ "bool __cdecl operator==(class Time &,class...

Ошибка при перегрузке оператора <<
class Predmet { private: int id; string name; public: Predmet() {}; Predmet(string name, int id) : name{ name }, id { id...

13
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
07.09.2016, 23:54
bad_alloc - это new не смог отработать. возможно слишком много попросили выделить.
надо узнать значение выражения в квадратных скобках: c.i + 1.
чему оно равно?
на случай если с дебагером не работали полезная инфа: Как пользоваться отладчиком (в Visual Studio)
0
1 / 1 / 0
Регистрация: 07.08.2014
Сообщений: 72
08.09.2016, 09:18  [ТС]
Цитата Сообщение от DU3 Посмотреть сообщение
bad_alloc - это new не смог отработать. возможно слишком много попросили выделить.
надо узнать значение выражения в квадратных скобках: c.i + 1.
чему оно равно?
на случай если с дебагером не работали полезная инфа: Как пользоваться отладчиком (в Visual Studio)
Вот что я понял с помощью отладчика. Оператор new выделяет место для указателя и забивает в указатель мусор из символов. В следующей строке к этому мусору прибавляется моя первая строка. Естественно в строку все это не влезает. Что с этим можно сделать? Со значением c.i все нормально. Если вводить не большие строки, то и число будет маленькое.
0
Модератор
Эксперт С++
 Аватар для zss
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,237
08.09.2016, 09:56
Цитата Сообщение от Саша Перков Посмотреть сообщение
strcat(c.p, a.p);
strcat(c.p + a.i, b.p);
C++
1
2
strcpy(c.p, a.p); 
strcat(c.p, b.p);
0
1 / 1 / 0
Регистрация: 07.08.2014
Сообщений: 72
08.09.2016, 15:21  [ТС]
Не помогло. Тоже самое происходит. Хотя по отладке все нормально. Функция даже нормально возвращает значение. Но уже в main происходит ошибка.
0
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
08.09.2016, 22:29
если String - это ваша самодельная строка - то неплохо бы весь код выложить. Ошибка может быть и в другом месте.
std::bad_alloc - это исключение, которое при new может сгенерироваться. strcpy - это сишные функции, которые исключений не генерируют. ну и если код выложить не получится - студии можно сказать, чтобы она останавливалась в точке генерации исключения и с этого места можно пройтись по стеку и посмотреть, откуда все таки взялся баг.
0
1 / 1 / 0
Регистрация: 07.08.2014
Сообщений: 72
08.09.2016, 22:58  [ТС]
Цитата Сообщение от DU3 Посмотреть сообщение
если String - это ваша самодельная строка - то неплохо бы весь код выложить. Ошибка может быть и в другом месте.
std::bad_alloc - это исключение, которое при new может сгенерироваться. strcpy - это сишные функции, которые исключений не генерируют. ну и если код выложить не получится - студии можно сказать, чтобы она останавливалась в точке генерации исключения и с этого места можно пройтись по стеку и посмотреть, откуда все таки взялся баг.
Смотрел. Сам не понял. Код сейчас весь скину.

Добавлено через 1 минуту
Заголовочный файл:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <string>
#include <iostream>
 
using namespace std;
 
class String
{
public:
    String();
    String(char[]);
    String(String &);
    
    ~String();
 
    friend istream & operator >> (istream & is, String  &);
    friend ostream & operator << (ostream & is, String  &);
    friend bool operator > (String &, String &);
    friend bool operator < (String &, String &);
    friend String operator+ (String &, String &);
    String & operator= (String &);
 
 
    int Lange();
 
private:
    int i;
    char *p;
};
Определения функций:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <iostream>
#include <string>
#include <cstring>
#include <cctype>
#include <fstream>
#include "Header.h"
#include <sstream>
 
using namespace std;
 
String::String()
{
    i = 1;
    p = '\0';
}
 
String::String(char s[])
{
    i = strlen(s);
    strcpy(p, s);
}
String::~String()
{
    delete p;
}
String::String(String & Str)
{
    p = new char[Str.i + 1];
    strcpy(p, Str.p);
}
 
 
istream & operator>>(istream & is, String & Str)
{
    char temp[1000];
    is.getline(temp, 1000);
    Str.i = strlen(temp);
    Str.p = new char[Str.i];
    strcpy(Str.p, temp);
    return is;
}
ostream & operator<<(ostream & is, String & Str)
{
    is << Str.p;
    return is;
}
bool operator>(String & a, String & b)
{
    if ((*a.p) > *(b.p))
        return true;
    else
        return false;
}
bool operator<(String & a, String & b)
{
    if ((*a.p) < *(b.p))
        return true;
    else
        return false;
}
String operator+(String & a, String & b)
{
    String c;
    c.i = a.i + b.i;
    c.p = new char[c.i + 1];
    strcpy(c.p, a.p);
    strcat(c.p, b.p);
    return c.p;
}
 
String & String::operator=(String & Str)
{
    i = Str.i;
    p = new char[i+1];
    strcpy(p, Str.p);
    return *this;
}
int String::Lange()
{
    return strlen(p);
}
Основной файл:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <string>
#include "Header.h"
#include <cctype>
#include <fstream>
 
using namespace std;
 
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    String x, y, z;
    cin >> x;
    y = x;
    cout << y;
 
    system("pause");
    return 0;
}
0
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
08.09.2016, 23:10
в конструкторе неверная инициализация указателя:
C++
1
2
3
4
5
6
String::String()
{
    i = 1; // ???
    //p = '\0';
    p = nullptr;
}
в строке 38 забили еденицу для нулевого байта. я не очень понял, надо эту еденицу к i добавлять или не надо.
в общем памяти должно быть выделено на один байт больше, чем длина строки.
C++
1
2
// Str.p = new char[Str.i];
Str.p = new char[Str.i + 1];
0
1 / 1 / 0
Регистрация: 07.08.2014
Сообщений: 72
08.09.2016, 23:58  [ТС]
Цитата Сообщение от DU3 Посмотреть сообщение
в строке 38 забили еденицу для нулевого байта. я не очень понял, надо эту еденицу к i добавлять или не надо.
в общем памяти должно быть выделено на один байт больше, чем длина строки.
Все сделал, но все-равно такая же фигня. "нарушение прав доступа при записи по адресу 0xCCCCCCCC" причем адрес такой всегда. Да, и что нужно сделать с i в конструкторе тогда? Если не 1.
0
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
09.09.2016, 00:09
Лучший ответ Сообщение было отмечено Саша Перков как решение

Решение

вам должно быть виднее. вы же класс придумали. конкретно ваш пример у меня отрабатывал без крашей. если вы еще как-то начали строки использовать - то не удивительно. например не инцициализирован указатель в String::String(char s[]), а него уже пытаются скопировать. в целом все очень и очень печально. прокачивайте дальше дебаггер, если эта работа не первая - это сэкономит вам кучу времени в будущем. еще вариант - поискать реализацию самодельных строк в сети. например тут на форуме таких строк и их разборок несчетное количество.
0
1 / 1 / 0
Регистрация: 07.08.2014
Сообщений: 72
09.09.2016, 00:18  [ТС]
Цитата Сообщение от DU3 Посмотреть сообщение
вам должно быть виднее. вы же класс придумали. конкретно ваш пример у меня отрабатывал без крашей. если вы еще как-то начали строки использовать - то не удивительно. например не инцициализирован указатель в String::String(char s[]), а него уже пытаются скопировать. в целом все очень и очень печально. прокачивайте дальше дебаггер, если эта работа не первая - это сэкономит вам кучу времени в будущем. еще вариант - поискать реализацию самодельных строк в сети. например тут на форуме таких строк и их разборок несчетное количество.
Да только только учу классы. Вот для практики попробовал такое написать. Я был бы очень признателен, если бы Вы указали бы мне на косяки или иные плохие моменты. Это помогло бы мне в будущем. Да, и что можно сделать с char s[] ?

Добавлено через 6 минут
Все, с вашей помощью я нашел ошибку. Спасибо Вам огромное. Переделал один из конструкторов:
C++
1
2
3
4
5
6
String::String(char s[])
{
    i = strlen(s);
    p = new char[i + 1];
    strcpy(p, s);
}
Отладчиком никак не смог выявить эту проблему. Но в будущем буду стараться.
0
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
09.09.2016, 00:20
практикуйтесь дальше. хождение по граблям положительно сказывается на усваивании матчасти .
косяки конкретно вашего класса должны быть расписаны в любом учебнике.
еще раз повторюсь - изучите возможности дебагера и научитесь с ним работать. потраченное на него время окупится, если с программированием у вас надолго.
0
1 / 1 / 0
Регистрация: 07.08.2014
Сообщений: 72
09.09.2016, 00:37  [ТС]
Цитата Сообщение от DU3 Посмотреть сообщение
практикуйтесь дальше. хождение по граблям положительно сказывается на усваивании матчасти .
косяки конкретно вашего класса должны быть расписаны в любом учебнике.
еще раз повторюсь - изучите возможности дебагера и научитесь с ним работать. потраченное на него время окупится, если с программированием у вас надолго.
Как посоветуете изучить возможности дебагера? Учебники, видео, гайды, руководства?
0
Модератор
Эксперт С++
 Аватар для zss
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,237
09.09.2016, 07:29
ПО отладчику здесь есть тема
Как пользоваться отладчиком (в Visual Studio)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.09.2016, 07:29
Помогаю со студенческими работами здесь

Ошибка при перегрузке оператора ввода
Решил для тренировки написать класс, который создает связанный список, типа массива. Проблеме при перегрузке оператора ввода &gt;&gt;...

Ошибка при перегрузке оператора cin >>
#include &lt;iostream&gt; using namespace std; /////////////////////////////////////////////////////////// class fraction { ...

Ошибка при перегрузке оператора вывода в файл
Добрый день, есть такой кусок кода: #include &lt;iostream&gt; #include &lt;ostream&gt; using std::ostream; using namespace std; ...

Ошибка в перегрузке оператора - при работе с массивами
Текст программы: #include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; class array { public: array(); ...

Ошибка при перегрузке оператора, не знаю как исправить
#pragma once #include &lt;iostream&gt; #include &lt;vector&gt; #define innerVectorType std::vector&lt;T&gt; template &lt;class T&gt; class Matrix ...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru