Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Керра
Модератор
 Аватар для Керра
1270 / 438 / 45
Регистрация: 24.08.2011
Сообщений: 2,123
21.08.2013, 16:16     Переменная удаляется после присваивания #1
После строки 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2013, 16:16     Переменная удаляется после присваивания
Посмотрите здесь:

C++ Переменная float - знаки после запятой
C++ какое значение примет переменная s после выполнения следующих операторов
C++ какое значение примет переменная s после выполнения следующих операторов
C++ Почему локальная переменная не уничтожается после выхода из функции
C++ Посмотрите описание конструктора копирования и оператора присваивания с ними все в порядке? После функции add теряются данные
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.08.2013, 16:20     Переменная удаляется после присваивания #2
потому что нет конструктора копирования
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
21.08.2013, 16:25     Переменная удаляется после присваивания #3
C++
1
String & String::operator= (const String & rStr)
вроде как стоит сначала проверить не пытаешься ли ты присвоить самого себя, string1 = string1;
потому что сначала твой стринг удалится, а потом будет пытаться присвоить пустоту. Но не в этом косяк, это замечание по коду.


ну и как верно подметили нет конструктора копирования, а точнее он есть, по умолчанию и вы наблюдаете его работу..
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.08.2013, 16:26     Переменная удаляется после присваивания #4
Цитата Сообщение от Керра Посмотреть сообщение
После строки 85 переменная c почему-то удаляется.
То есть, вот это у вас ничего не выводит?
C++
1
cout << c.GetString() << endl;
Керра
Модератор
 Аватар для Керра
1270 / 438 / 45
Регистрация: 24.08.2011
Сообщений: 2,123
21.08.2013, 16:32  [ТС]     Переменная удаляется после присваивания #5
alsav22, то есть на этом появляется ошибка
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 771
Регистрация: 27.09.2012
Сообщений: 16,905
Записей в блоге: 2
Завершенные тесты: 1
21.08.2013, 16:34     Переменная удаляется после присваивания #6
Керра, Добавьте конструктор копий, иначе в функции
C++
1
2
3
4
5
6
String String::operator+ (const String & rStr)
{
    String res(resLen);
 
    return res;
};
при возвращении значения будет сделана копия объекта с помощью конструктора копий, сгенерированного компилятором и после удаления объекта res эта копия станет не действительной
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.08.2013, 16:42     Переменная удаляется после присваивания #7
Цитата Сообщение от Керра Посмотреть сообщение
alsav22, то есть на этом появляется ошибка
Забыл с Release переключить и удивляюсь, почему у меня всё нормально работает. Почему в Release всё работает?
Керра
Модератор
 Аватар для Керра
1270 / 438 / 45
Регистрация: 24.08.2011
Сообщений: 2,123
21.08.2013, 16:44  [ТС]     Переменная удаляется после присваивания #8
понятно, добавила копировщик, все работает) спасибо)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2013, 16:45     Переменная удаляется после присваивания
Еще ссылки по теме:

Чему будет равна переменная после выполнения следующего фрагмента программы? C++
Глобальная переменная после вызова функции меняет значение C++
C++ После выполнения (завершения) функции test переменная умрет, а что будет с переменной в Result?

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

Или воспользуйтесь поиском по форуму:
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
21.08.2013, 16:45     Переменная удаляется после присваивания #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Почему в Release всё работает?
Возможно потому что нет отладочного кода, который проверяет целостность кучи, стека и т.д. Т.е. память освободилась, но не затерлась, поэтому выводится то, что ожидается. А в дебаге компилятор подставляет код, которые проверяет такие вещи и выдает ошибки.
Yandex
Объявления
21.08.2013, 16:45     Переменная удаляется после присваивания
Ответ Создать тему
Опции темы

Текущее время: 12:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru