C++ 赋值运算符重载:错误处理场景

C++ 赋值运算符重载:错误处理场景,c++,string,C++,String,在回答问题之前,请参考下面的程序。在注释中解释了代码 所以我这里的问题是赋值运算符重载如何处理new()无法分配内存的情况 例如,Obj1持有字符串“geeksquick”。将Obj2分配给Obj1。在赋值过程中(在赋值运算符重载功能中),首先释放Obj1,然后使用Obj2值重新创建Obj1。因此,在new无法分配内存的情况下,如何保留旧的Obj1值?因为我们在函数开始时释放了Obj1值 我只想在赋值操作失败时使用Obj1的旧值 请帮我做这件事。我想要完美的代码,没有任何内存泄漏覆盖所有场景。提

在回答问题之前,请参考下面的程序。在注释中解释了代码

所以我这里的问题是赋值运算符重载如何处理new()无法分配内存的情况

例如,
Obj1
持有字符串
“geeksquick”
。将
Obj2
分配给
Obj1
。在赋值过程中(在赋值运算符重载功能中),首先释放
Obj1
,然后使用
Obj2
值重新创建
Obj1
。因此,在
new
无法分配内存的情况下,如何保留旧的
Obj1
值?因为我们在函数开始时释放了
Obj1

我只想在赋值操作失败时使用
Obj1
的旧值

请帮我做这件事。我想要完美的代码,没有任何内存泄漏覆盖所有场景。提前谢谢

#include<iostream>
#include<cstring>
using namespace std;

class String
{
private:
    char *string_data;
    int size;
public:
    String(const char *str = NULL); // constructor
    ~String() { delete [] string_data;  }// destructor
    void print() { cout << string_data << endl; } // Function to print string
    String& operator = (const String &); // assignment operator overload
};

String::String(const char *str)  // Constructor
{
    size = strlen(str);
    string_data = new char[size+1];
    if (string_data != NULL)
        strcpy(string_data, str);
    else
        cout<<"compiler failed to allocate new memory";
}

String& String::operator = (const String &str) // assignment operator overload
{
    if(this != &str) 
    {
        delete [] string_data; // Deleting old data and assigning new data below
        size = str.size;
        string_data = new char[size+1];
        if(string_data != NULL) // This condition is for cheking new memory is success 
            strcpy(string_data, str.string_data);
        else
            cout<<"compiler failed to allocate new memory"; // My quetsion comes in this scenario...
    }
    return *this;
}

int main()
{
    String Obj1("GeeksQuiz");
    String Obj2("stackoverflow");

    Obj1.print(); // Printing Before assigment
    Obj2.print();

    Obj1 = Obj2;  // Assignment is done. 

    Obj1.print(); // Printing After assigment
    Obj2.print();
    return 0;
}
#包括
#包括
使用名称空间std;
类字符串
{
私人:
字符*字符串_数据;
整数大小;
公众:
字符串(const char*str=NULL);//构造函数
~String(){delete[]String_data;}//析构函数

void print(){cout临时变量或伪变量

分配新内存,将指针分配给临时变量。如果分配成功,则释放旧内存并重新分配该指针变量


伪ish代码:

char *temp = new char[new_size];
std::copy(new_data, new_data + new_size, temp);
delete [] old_data;
old_data = temp;
old_size = new_size;

临时变量或伪变量

分配新内存,将指针分配给临时变量。如果分配成功,则释放旧内存并重新分配该指针变量


伪ish代码:

char *temp = new char[new_size];
std::copy(new_data, new_data + new_size, temp);
delete [] old_data;
old_data = temp;
old_size = new_size;

首先,在临时变量中分配内存,如果成功,则只删除旧值。

首先在临时变量中分配内存,如果成功,则只删除旧值。

首先,实现一个健壮的字符串是困难的,除非您想为了学习的目的而使用
std::string

然后考虑始终返回非空指针(除非您还实现了非标准的自定义
new
运算符),如果分配数据失败,它将抛出
std::bad_alloc
异常。如果您想处理分配失败的情况,则需要添加一个try-catch块

char *data = NULL;
try {
  data = new char[str.size + 1];
} catch (std::bad_alloc &e) {
  std::cout << "Allocation failed: " << e.what() << std::endl;
  throw; // <- You probably want to rethrow the exception.
}
strcpy(data, str.string_data);
delete [] string_data;
string_data = data;
size = str.size;
char*data=NULL;
试一试{
数据=新字符[str.size+1];
}捕获(标准::错误分配和e){

std::cout首先,实现一个健壮的字符串是很困难的,除非您想出于学习目的而这样做,请始终使用
std::string

然后考虑始终返回非空指针(除非您还实现了非标准的自定义
new
运算符),如果分配数据失败,它将抛出
std::bad_alloc
异常。如果您想处理分配失败的情况,则需要添加一个try-catch块

char *data = NULL;
try {
  data = new char[str.size + 1];
} catch (std::bad_alloc &e) {
  std::cout << "Allocation failed: " << e.what() << std::endl;
  throw; // <- You probably want to rethrow the exception.
}
strcpy(data, str.string_data);
delete [] string_data;
string_data = data;
size = str.size;
char*data=NULL;
试一试{
数据=新字符[str.size+1];
}捕获(标准::错误分配和e){

std::你能为该函数添加正确的代码吗?你的伪ish代码看起来非常不正确。故意的?@Wolf你为什么这么说?如果这些变量被定义,它实际上是四个完全有效的语句。
old_data
看起来像是数据源,我知道它代表了问题的
string_data
部分这样更好,但我认为它看起来仍然很奇怪,因为混合了新的和旧的代码…你能为该函数添加正确的代码吗?你的伪ish代码看起来非常不正确。故意的?@Wolf你为什么这么说?如果这些变量被定义,它实际上是四个完全有效的语句。
old_data
看起来像e它是数据源,我知道它代表了问题的
string\u data
部分。更好,但我认为它看起来仍然很奇怪,因为混合了新的和旧的样式代码…首先分配,然后如果一切都好的话,删除旧数据。赋值操作符中的
if
路径没有返回任何东西。究竟为什么要这样做你认为你可以——仅仅是为了好玩(或者练习?)——实现一个健壮的字符串类?如果你想用C++编程,学习使用它的标准库!@沃尔夫:我也有同样的疑虑,比如你。但是在我的一次采访中被问到了。谢谢UI,我的同情!(陌生的采访者!火箭科学?)首先分配,然后如果一切正常,则删除旧数据。赋值运算符中的
if
路径不会返回任何内容。你到底为什么认为你可以这样做?只是为了好玩(或练习?)“实现一个健壮的字符串类?如果你想在C++中编程,学习使用它的标准库!”沃尔夫:我也有同样的疑虑,比如你。但是在我的一次采访中被问到了。谢谢UI,我的同情心!(陌生的采访者!火箭科学)字符串和字符串::操作符=(const string和STR)/赋值操作符过载{if(this!=&str)//自分配检查{int temp_int=str.size;char*temp_string=new char[size+1];strcpy(temp_string,str.string_data);if(string_data!=NULL)//此条件用于检查新内存是否成功{size=temp_int;delete[]string_data;strcpy(string_data,temp_string)}否则在指针字符串复制方面可能会很弱。请检查并更正meString&string::operator=(const string&str)//赋值运算符重载{if(this!=&str){size=str.size;char*string_data\u temp=new char[size+1];if(string_data_temp!=NULL)//此条件用于检查新内存是否成功{delete[]string_data;//立即删除string_data=string_data_temp;strcpy(string_data,str.string_data);}else coutString&string::operator=(const string&str)//赋值运算符重载{if(this!=&str)//自赋值检查{int temp\u int=str.size;char*temp\u string=new char[s]