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

Найти ошибки в коде и исправить эти ошибки - C++

21.09.2016, 17:44. Показов 3363. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Судя по вываливающейся ошибки, идет двойное освобождение памяти. У самого не получается отловить откуда.

A.h
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#pragma once
class A
{
private:
    size_t size_;
    char* str_;
    double ab_;
public:
    A(){};
    A(size_t size, char* str, double ab) : size_(size), str_(new char[size + 1]), ab_(ab){
        for (size_t i = 0; i < size_; i++)
            str_[i] = str[i];
        str_[size_] = '\0';
    };
    A(const A&);
    ~A();
    A operator=(const A&);
    void show_();
    friend A operator+(A, A);
};


A.cpp
Кликните здесь для просмотра всего текста

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
#include "A.h"
#include<iostream>
 
A::~A(){ 
    if (str_)
    delete[] str_; 
}
 
A::A(const A& a){
    if (this != &a){
        if (str_)
            delete[] str_;
        size_ = a.size_;
        str_ = new char[size_ + 1];
        for (size_t i = 0; i < size_; i++)
            str_[i] = a.str_[i];
        str_[size_] = '\0';
        ab_ = a.ab_;
    }
}
 
A A::operator=(const A& a){
    if (this != &a){
        if (str_)
            delete[] str_;
        size_ = a.size_;
        str_ = new char[size_ + 1];
        for (size_t i = 0; i < size_; i++)
            str_[i] = a.str_[i];
        str_[size_] = '\0';
        ab_ = a.ab_;
    }
    return *this;
}
 
void A::show_(){
    std::cout << "Кол-во символов: " << size_ << std::endl;
    std::cout << str_ << std::endl;
    std::cout << "Вещественное число: " << ab_ << std::endl;
}
 
A operator+(A a1, A a2){
    A a3;
    a3.size_ = a1.size_ + a2.size_;
    if (a3.str_)
        delete[] a3.str_;
    a3.str_ = new char[a3.size_ + 1];
    for (size_t i = 0; i < a1.size_; i++)
        a3.str_[i] = a1.str_[i];
    for (size_t i = 0; i < a2.size_; i++)
        a3.str_[a1.size_ + i] = a2.str_[i];
    a3.str_[a3.size_] = '\0';
    a3.ab_ = a1.ab_ + a2.ab_;
    return a3;
}


main.cpp
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
#include"A.h"
 
int main(){
    setlocale(0, "");
    A a1(11, "Привет мир!", 1.01);
    A a2(10, " Как дела?", 2.8);
    a1.show_();
    a2.show_();
    A a3(5," sd", 3.7);
    a3 = a1 + a2;
    a3.show_();
 
    system("pause");
    return 0;
}


Добавлено через 33 минуты
Хм.. Поправил конструктор копирования и все заработало.
C++
1
2
3
4
5
6
7
8
A::A(const A& a){
        size_ = a.size_;
        str_ = new char[size_ + 1];
        for (size_t i = 0; i < size_; i++)
            str_[i] = a.str_[i];
        str_[size_] = '\0';
        ab_ = a.ab_;
}
Вот только такое чувство что там может образоваться утечка памяти, или я зря волнуюсь и все там нормально?
Проконсультируйте пожалуйста по этому коду меня, всёли зделано правильно и что можно поправить, с меня громадная благодарность и + к карме.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.09.2016, 17:44
Ответы с готовыми решениями:

Найти ошибки в коде и исправить эти ошибки (Наследование)
Вот в общем 3 файла, изучаю наследование на примере односвязного и двусвязного списков: list.h (inline) #pragma once class list...

Найти ошибки в коде и исправить эти ошибки
Есть у меня вот такой код: #include &lt;iostream&gt; using namespace std; class A{ private: int* a; size_t size_; ...

Найти причины возникновения ошибок в коде и исправить эти ошибки
Совсем я запуталась. Опять куча ошибок. Помогите разобраться, пжлст. П.5.18.Правил Запрещено размещать задания и решения в виде...

4
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
21.09.2016, 17:50
Цитата Сообщение от Chronid Посмотреть сообщение
C++
1
A operator=(const A&);
C++
1
const A& operator=(const A&);
Цитата Сообщение от Chronid Посмотреть сообщение
C++
1
A operator+(A, A);
C++
1
A operator+(const A&, const A&A);
Добавлено через 27 секунд
Цитата Сообщение от Chronid Посмотреть сообщение
C++
1
void show_();
C++
1
void show_()const;
Добавлено через 1 минуту
Цитата Сообщение от Chronid Посмотреть сообщение
A(){};
баг:
C++
1
2
3
4
5
6
#include<iostream>
#include"A.h"
 
int main(){
    A a1;
}
1
2 / 2 / 0
Регистрация: 23.03.2015
Сообщений: 55
21.09.2016, 18:06  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
баг:
C++
1
2
3
4
#include<iostream>
#include"A.h"
int main(){
 A a1;
}
Извените, а в чем тут баг?
У меня все работает без ошибок..
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
21.09.2016, 18:24
Цитата Сообщение от Chronid Посмотреть сообщение
Извените, а в чем тут баг?
вот здесь:
Цитата Сообщение от Chronid Посмотреть сообщение
C++
1
A(){};
дефолтный конструктор не выставляет значения своим данным-членам.
вот здесь:
Цитата Сообщение от Chronid Посмотреть сообщение
C++
1
char* str_;
будет мусор
далее когда завершиться время жизни объекта сработает:
Цитата Сообщение от Chronid Посмотреть сообщение
C++
1
2
3
4
A::~A(){ 
if (str_)
delete[] str_; 
}
из-за мусора условие выполнится.
и начнется попытка грохнуть память по случайному адресу.
что завершится аварией.
Цитата Сообщение от Chronid Посмотреть сообщение
У меня все работает без ошибок..
вероятно у вас линукс какой нибудь.
на них система при старте процесса зануляет всю память.
но в процессе работы память заполниться различным мусором.
и однажды этот мусор убъет процесс.
1
2 / 2 / 0
Регистрация: 23.03.2015
Сообщений: 55
21.09.2016, 18:58  [ТС]
Спс, убрал конструктор по умочнанию и подправил конструктор с параметрами
на зануление в случае отсутствия входящих аргументов:
C++
1
A(size_t size = 0, char* str = 0, double ab = 0)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.09.2016, 18:58
Помогаю со студенческими работами здесь

Найти причины возникновения ошибок в коде и исправить эти ошибки
помогите пожалуйста исправить ошибку вот код в с++ // ConsoleApplication9.cpp: определяет точку входа для консольного приложения. ...

Найти причины возникновения ошибок в коде и исправить эти ошибки
#include &lt;vcl.h&gt; #include &lt;iostream.h&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; #pragma hdrstop ...

Найти причины возникновения ошибок в коде и исправить эти ошибки
Всем привет, я новичок. Решил попробовать создать простенький класс который выводит данные которые вы ввели, но после того как я ввожу...

Найти причины возникновения ошибок в коде и исправить эти ошибки
// Висимских.cpp : Defines the entry point for the console application. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;math.h&gt; ...

Найти причины возникновения ошибок в коде и исправить эти ошибки
#include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;iterator&gt; #include &lt;algorithm&gt; #include &lt;vector&gt; #include &lt;string.h&gt; ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача №1: при указании работ (справочник РаботыПоРемонтуСпецтехники),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru