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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
MayaNash
1285 / 453 / 47
Регистрация: 24.08.2011
Сообщений: 2,214
#1

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

21.08.2013, 16:16. Просмотров 339. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2013, 16:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Переменная удаляется после присваивания (C++):

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

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

Посмотрите описание конструктора копирования и оператора присваивания с ними все в порядке? После функции add теряются данные - C++
class Person{ char *name; int age; char *floor; char *phone; public: Person(){ cout&lt;&lt;&quot; ok&quot;&lt;&lt;endl; age=0; ...

Неправильная работа оператора присваивания после работы оператора суммирования - C++
Доброго времени суток. У меня есть класс вектор class TVector {//ewde public: TVector(); //Vector(Vector &amp;v); TVector(int...

Переменная float - знаки после запятой - C++
Итак я задаю какую-либо переменную типа float. Потом, с помощью scanf кладу в эту переменную значение 3.2 (к примеру.) Затем, с помощью...

Почему локальная переменная не уничтожается после выхода из функции - C++
В функции создается строка char *pn = new char;. Мне непонятно почему при выходе из функции эта строка доступна в main()? Почему эта строка...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.08.2013, 16:20 #2
потому что нет конструктора копирования
1
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
21.08.2013, 16:25 #3
C++
1
String & String::operator= (const String & rStr)
вроде как стоит сначала проверить не пытаешься ли ты присвоить самого себя, string1 = string1;
потому что сначала твой стринг удалится, а потом будет пытаться присвоить пустоту. Но не в этом косяк, это замечание по коду.


ну и как верно подметили нет конструктора копирования, а точнее он есть, по умолчанию и вы наблюдаете его работу..
1
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.08.2013, 16:26 #4
Цитата Сообщение от Керра Посмотреть сообщение
После строки 85 переменная c почему-то удаляется.
То есть, вот это у вас ничего не выводит?
C++
1
cout << c.GetString() << endl;
0
MayaNash
1285 / 453 / 47
Регистрация: 24.08.2011
Сообщений: 2,214
21.08.2013, 16:32  [ТС] #5
alsav22, то есть на этом появляется ошибка
1
Croessmah
Эксперт CЭксперт С++
13227 / 7499 / 845
Регистрация: 27.09.2012
Сообщений: 18,418
Записей в блоге: 3
Завершенные тесты: 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 эта копия станет не действительной
1
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.08.2013, 16:42 #7
Цитата Сообщение от Керра Посмотреть сообщение
alsav22, то есть на этом появляется ошибка
Забыл с Release переключить и удивляюсь, почему у меня всё нормально работает. Почему в Release всё работает?
0
MayaNash
1285 / 453 / 47
Регистрация: 24.08.2011
Сообщений: 2,214
21.08.2013, 16:44  [ТС] #8
понятно, добавила копировщик, все работает) спасибо)
1
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
21.08.2013, 16:45 #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Почему в Release всё работает?
Возможно потому что нет отладочного кода, который проверяет целостность кучи, стека и т.д. Т.е. память освободилась, но не затерлась, поэтому выводится то, что ожидается. А в дебаге компилятор подставляет код, которые проверяет такие вещи и выдает ошибки.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2013, 16:45
Привет! Вот еще темы с ответами:

Глобальная переменная после вызова функции меняет значение - C++
До flag = 0; odnorod_pril(buffer1); После int odnorod_pril(char *buffer) { flag точно равен 1, проверял в памяти и просто...

После int функции переменная, проинициализированная снаружи, не обновляется - C++
Здравствуйте. Собственно сабж. Обработчик события нажатия на кнопку. Gener G(1,1); int...

Какое значение примет переменная s после выполнения следующих операторов? - C++
s=0; for (i=5; i&gt;1; i--) s=s+i;

Какое значение примет переменная s после выполнения следующих операторов? - C++
int i, s=10, a=3; for (i=1; i&lt;4; i++) if (i==a) s=s*a*a; else s=a; s=s/a;


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.08.2013, 16:45
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru