课间信息丢失 我在C++中的一个编程类,我们需要设计一个匹配代理,并且在我创建一个新的客户端之后,它会把它添加到操作员的+=到客户端数组中,然后在菜单类中,数据库丢失了客户端,我找不到原因。p>

课间信息丢失 我在C++中的一个编程类,我们需要设计一个匹配代理,并且在我创建一个新的客户端之后,它会把它添加到操作员的+=到客户端数组中,然后在菜单类中,数据库丢失了客户端,我找不到原因。p>,c++,class,C++,Class,添加客户端操作员 MatchmakingAgency& MatchmakingAgency:: operator+=( Client& c1) { if (m_clients)//Client** m_clients; { m_length++; Client** newArr = new Client * [m_length]; if (!newArr) { cout

添加客户端操作员

MatchmakingAgency& MatchmakingAgency:: operator+=( Client& c1)
{   
    if (m_clients)//Client** m_clients; 
    {
        m_length++;
        Client** newArr = new Client * [m_length];
        if (!newArr)
        {
            cout << " Memory allocation failed!" << endl;
            return *this;
        }
        //copy old array to new
        for (int i = 0; i < m_length - 1; i++)
        {
            newArr[i] = m_clients[i];
        }
        newArr[m_length - 1] = &c1;
        //delete allocation
        delete[] m_clients;
        m_clients = newArr;
        delete[] newArr;
    }
    else //m_clients is empty
    {
        m_length = 1;
        m_clients = new Client * [1];

        if (!m_clients)
        {
            cout << " Memory allocation failed!" << endl;
            return *this;
        }
        m_clients[0]= &c1;
    }
    return *this;
}
MatchmakingAgency和MatchmakingAgency::operator+=(客户端和c1)
{   
if(m_clients)//Client**m_clients;
{
m_长度++;
客户**newArr=新客户*[m_长度];
如果(!newArr)
{
性别差异;
年龄;
if(年龄<18岁)
{
没有多少爱好;

cout您已经将客户端指针复制到了newArr,添加了新的指针,然后在将m_clients设置为newArr指针后,您通过删除newArr指针删除了刚才复制的所有内容

    delete[] m_clients;
    m_clients = newArr;
    delete[] newArr;

您已经将客户端指针复制到了newArr,添加了新指针,然后在将m_clients设置为newArr指针之后,您通过删除newArr指针删除了刚才复制的所有内容

    delete[] m_clients;
    m_clients = newArr;
    delete[] newArr;


重载运算符的全部意义在于,它允许您在
运算符+=
中写入
m_data_base+=cl1;
,您正在执行1
new
,但2
delete
s。删除
delete[]newArr;
line。您需要
m_客户机
指向的内存。不要存储使用
&
获取的指针以供以后使用。
m_客户机=newArr;delete[]newArr;
相当于
m_客户机=newArr;delete[]m_客户机;
您的
内存分配失败!
错误检查毫无意义。
new
在分配失败时抛出异常。重载运算符的全部意义在于,它允许您在
运算符+=
中写入
m_数据库+=cl1;
,您正在执行1
新建
,但2
删除
的操作。Re移动
delete[]newArr;
行。您需要
m_clients
指向的内存。不要存储使用
&
获取的指针以供以后使用。
m_clients=newArr;delete[]newArr;
等同于
m_clients=newArr;delete[]m_clients;
您的
内存分配失败!
错误检查毫无意义。
new
在分配失败时抛出异常。因此,我必须使用for循环复制它?然后删除?@sanchrpNo正如他们上面所说的,不要删除您的newArr指针,它存储在m_clients成员变量中。如果函数是continuing,您希望确保不要做任何愚蠢的事情,您可以将newArr设置为nullptr,以避免间接修改m_客户端,但在本例中,只需删除该行。我删除了该行,没有多大帮助,仍然丢失客户端信息尝试调试它数百万次,我写了调试器显示它丢失的地方@sanchrpYou's have另一个p问题。您正在传递一个局部变量(堆栈)将+=运算符作为引用,然后保存该客户端的指针,如果优化器判断不再需要,该指针将在“菜单添加”函数末尾或更早的时候释放。您需要在堆上为客户端分配一个新客户端,并将参数复制到其中。因此,我必须使用for循环复制它,然后删除?@sanchrpNo as t如上所述,不要删除您的newArr指针,它存储在m_clients成员变量中。如果函数正在继续,并且您希望确保不做任何愚蠢的事情,您可以将newArr设置为nullptr,以避免间接修改m_clients,但在这种情况下,只需删除该行。我删除了该行,没有多大帮助,仍然很低osing client info尝试调试它数百万次,我写了调试器显示它丢失的地方@sanchrpYou有另一个问题。您正在传递一个局部变量(堆栈)将+=运算符作为引用,然后保存该客户机的指针,如果优化器判断不再需要,该指针将在“菜单添加”函数末尾或更早的时候解除分配。您需要在堆上为客户机分配一个新的客户机,并将参数复制到其中。