课间信息丢失 我在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;
,您正在执行1new
,但2delete
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有另一个问题。您正在传递一个局部变量(堆栈)将+=运算符作为引用,然后保存该客户机的指针,如果优化器判断不再需要,该指针将在“菜单添加”函数末尾或更早的时候解除分配。您需要在堆上为客户机分配一个新的客户机,并将参数复制到其中。