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

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

21.09.2016, 17:44. Показов 3286. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru