#include
#include
#include
using namespace std;
class samp {
char *s;
public:
samp() { s = nullptr; }
~samp() {
if(s) free(s);
cout << "s освобождается" << endl;
}
void show() {
if (s) cout << s << endl;
}
void set(const char *str);
// Конструктор копирования
samp(const samp &obj) {
if (obj.s) {
s = (char*)malloc(strlen(obj.s) + 1);
strcpy(s, obj.s);
} else {
s = nullptr;
}
}
// Оператор присваивания
samp& operator=(const samp &obj) {
if (this != &obj) {
if (s) free(s);
if (obj.s) {
s = (char*)malloc(strlen(obj.s) + 1);
strcpy(s, obj.s);
} else {
s = nullptr;
}
}
return *this;
}
};
// Строка загружается.
void samp::set(const char *str) {
s = (char *) malloc(strlen(str) + 1);
if (!s) {
cout << "Ошибка выделения места в памяти" << endl;
exit(1);
}
strcpy(s, str);
}
// возврат объекта типа samp.
samp input() {
char s[80];
samp str;
cout << "Введите строку: ";
cin >> s;
str.set(s);
return str;
}
int main() {
samp ob;
ob = input(); // Это теперь работает корректно.
ob.show();
return 0;
}
sshirtd accУченик (77)
6 месяцев назад
Вы должны быть осторожны при возврате объектов из функций, если эти объекты имеют деструктивные функции. Потому что, как только это значение возвращается, возвращаемый объект выходит за пределы области доступа.
Например, предположим, что объект, возвращаемый функцией, имеет деструктор, который освобождает его динамически выделенную память. Эта память будет освобождена, даже если объект, которому было присвоено возвращаемое значение, все еще использует его.