Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249

Переменная удаляется после присваивания

21.08.2013, 16:16. Показов 981. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
После строки 85 переменная c почему-то удаляется.
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
82
83
84
85
86
87
88
89
90
91
#include "stdafx.h"
#include <iostream>
#include <string.h>
#include <conio.h>
using namespace std;
 
class String
{
public:
    String(): itsLen(0), itsString('\0') { cout << "Constructor()\n"; _getch(); }
    String(const char * const);
    ~String();
 
    char & operator[] (int pos) { return itsString[pos]; }
    char operator[] (int pos) const { return itsString[pos]; }
    String & operator= (const String &);
    String operator+ (const String &);
 
    int GetLen() const { return itsLen; }
    const char * GetString() const { return itsString; }
 
private:
    char * itsString;
    int itsLen;
    String(int);
};
 
String::String(int len): itsLen(len)
{
    itsString = new char[len+1];
    for (int i = 0; i <= len; i++)
        itsString[i] = '\0';
    cout << "Construtor(int)\n";
    _getch();
};
 
String::String(const char * const cStr)
{
    itsLen = strlen(cStr);
    itsString = new char[itsLen+1];
    for (int i = 0; i < itsLen; i++)
        itsString[i] = cStr[i];
    itsString[itsLen] = '\0';
    cout << "Constructor(char *)\n";
    _getch();
};
 
String::~String()
{
    delete [] itsString;
    cout << "Destructor\n";
    _getch();
};
 
String & String::operator= (const String & rStr)
{
    delete [] itsString;
    itsLen = rStr.GetLen();
    itsString = new char[itsLen+1];
    for (int i = 0; i < itsLen; i++)
        itsString[i] = rStr[i];
    itsString[itsLen] = '\0';
    cout << "Operator =\n";
    _getch();
    return (*this);
};
 
String String::operator+ (const String & rStr)
{
    int resLen = itsLen + rStr.GetLen();
    String res(resLen);
    int i,j;
    for (i = 0; i < itsLen; i++)
        res[i] = itsString[i];
    for (i = itsLen, j = 0; j < rStr.GetLen(); i++, j++)
        res[i] = rStr[j];
    cout << "Operator +\n";
    _getch();
    return res;
};
 
int main()
{
    String a("a "), b("b "), c;
    c = a + b;
    cout << "Assignment is completed\n";
    _getch();
    cout << c.GetString() << endl;
    system("pause");
    return 0;
}
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.08.2013, 16:16
Ответы с готовыми решениями:

Почему оператор присваивания удаляется?
Возьмём код #include &lt;vector&gt; class C { const std::vector&lt;int&gt; v; }; int main() {

Логическая переменная и оператор присваивания
С помощью логической переменной и оператора присваивания определить: 1-я цифра у 3-хзначного числа больше 3-й цифры.

Удаляется string после выполнения функции
Всем привет. Я начинающий в языке C++ и поэтому прошу помощи. У меня внутри функции создается объект типа string, string принимает участие...

8
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
21.08.2013, 16:20
потому что нет конструктора копирования
1
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
21.08.2013, 16:25
C++
1
String & String::operator= (const String & rStr)
вроде как стоит сначала проверить не пытаешься ли ты присвоить самого себя, string1 = string1;
потому что сначала твой стринг удалится, а потом будет пытаться присвоить пустоту. Но не в этом косяк, это замечание по коду.


ну и как верно подметили нет конструктора копирования, а точнее он есть, по умолчанию и вы наблюдаете его работу..
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.08.2013, 16:26
Цитата Сообщение от Керра Посмотреть сообщение
После строки 85 переменная c почему-то удаляется.
То есть, вот это у вас ничего не выводит?
C++
1
cout << c.GetString() << endl;
0
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
21.08.2013, 16:32  [ТС]
alsav22, то есть на этом появляется ошибка
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
21.08.2013, 16:34
Керра, Добавьте конструктор копий, иначе в функции
C++
1
2
3
4
5
6
String String::operator+ (const String & rStr)
{
    String res(resLen);
 
    return res;
};
при возвращении значения будет сделана копия объекта с помощью конструктора копий, сгенерированного компилятором и после удаления объекта res эта копия станет не действительной
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.08.2013, 16:42
Цитата Сообщение от Керра Посмотреть сообщение
alsav22, то есть на этом появляется ошибка
Забыл с Release переключить и удивляюсь, почему у меня всё нормально работает. Почему в Release всё работает?
0
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
21.08.2013, 16:44  [ТС]
понятно, добавила копировщик, все работает) спасибо)
1
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
21.08.2013, 16:45
Цитата Сообщение от alsav22 Посмотреть сообщение
Почему в Release всё работает?
Возможно потому что нет отладочного кода, который проверяет целостность кучи, стека и т.д. Т.е. память освободилась, но не затерлась, поэтому выводится то, что ожидается. А в дебаге компилятор подставляет код, которые проверяет такие вещи и выдает ошибки.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.08.2013, 16:45
Помогаю со студенческими работами здесь

После использования операции присваивания ошибку выдает само удаление файла
У меня есть шаблон. Его принцип работы как ArrayList из java. Но есть проблема с удалением нетипизированого массива или с операцией...

Переменная сессии не удаляется после pc restart
Здравствуйте, уважаемые форумчане! Столкнулся со следующей проблемой: на сайте есть user logout (после авторизации пользователя) и все...

Переменная стаёт undefined в следующей после присваивания инструкции
Не пойму в чём тут проблема:

Если a=true и x=1, то какое значение получит логическая переменная d после выполнения оператора присваивания
а) d:=x&lt;2; б)d:=not a or odd(x); в)d:=odd(a)&lt;&gt;x Вычислить значение логических выражений 1) t and (P mod 3=0 ) при t=true ,...

Какое значение получит переменная p при выполнении следующего оператора присваивания?
var p: set of 0..9; i, j: integer; Если i=2 и j=5, то какое значение получит переменная p при выполнении следующего оператора...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru