gpt4 book ai didi

c++ - 使用 strcpy 时出现异常错误

转载 作者:太空宇宙 更新时间:2023-11-04 11:23:48 27 4
gpt4 key购买 nike

我正在为类做 BST。类里面有 5 个文件,其中 2 1/2 我无法编辑(作为 OOP 中的练习)。我无法编辑 data.h、driver.cpp 或 bst.cpp 的公共(public)成员。

尝试在我的 data.cpp 文件中使用 strcpy 时遇到一些异常错误。这些是相关的,因为我在 bst.cpp 中的插入函数从驱动程序发送了一个数据对象作为参数。

错误的形式是

Unhandled exception at 0x0F3840D9 (msvcr120d.dll) in asgmt04.exe: 0xC0000005: 
Access violation writing location 0x00000000.

这是一些代码

在 bst.cpp 中

void BST::insert(const Data& data)
{
if (index > capacity)
grow();

if (items[index].isEmpty == true)
{
items[index].data.setName(data.getName());
nItems++;
items[index].isEmpty = false;
items[index].loc = index;
}
else if (data < items[index].data)
{
index = (2 * index) + 1;
insert(data);
}
else
{
index = (2 * index) + 2;
insert(data);
}
}

同样,我无法编辑函数原型(prototype),因为它是公共(public)成员。

在data.h中

char const * const getName() const { return name; }

在data.cpp中

void Data::setName(char const * const name)
{
strcpy(this->name, name);
}

我也尝试过使用重载 = 运算符并遇到了同样的问题。调用它的代码看起来像

items[index].data = data; //second arg is the one passed into insert function

在data.cpp中

Data& Data::operator=(const Data& data2)
{
strcpy(this->name, data2.name);
return *this;
}

最佳答案

我怀疑你当时执行了这条线

strcpy(this->name, data2.name);

this->name 中没有足够的空间来容纳 data2.name。这是一个建议:

Data& Data::operator=(const Data& data2)
{
// Prevent self assignment.
if ( this != &data2 )
{
if (strlen(this->name) < strlen(data2.name) )
{
// Assuming that you used new to allocate memory.
delete [] this->name;
this->name = new char[strlen(data2.name) + 1];
}
strcpy(this->name, data2.name);
}
return *this;
}

更新,回应 OP 的评论

如果 Data::name 允许为 NULL,则需要进行更多检查。

Data& Data::operator=(const Data& data2)
{
// Prevent self assignment.
if ( this != &data2 )
{
if ( this->name == NULL )
{
if ( data2.name == NULL )
{
// Nothing needs to be done.
}
else
{
this->name = new char[strlen(data2.name) + 1];
strcpy(this->name, data2.name);
}
}
else
{
if ( data2.name == NULL )
{
delete this->name;
this->name = NULL;
}
else
{
if ( strlen(this->name) < strlen(data2.name) )
{
// Assuming that you used new to allocate memory.
delete [] this->name;
this->name = new char[strlen(data2.name) + 1];
}
strcpy(this->name, data2.name);
}
}
}
return *this;
}

关于c++ - 使用 strcpy 时出现异常错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27371828/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com