我有一个由winery
元素组成的双线程链表,winery
是一个具有自己数据字段的类。我似乎遇到的问题是我的winery元素中的cstring数据字段。现在我在Linux中收到"双重自由或损坏(出):0x0000000000402940"错误,所以我禁用了我的winery元素析构函数:
winery::~winery()
{
delete[] name;
delete[] location;
}
,在Linux中修复了这个错误。虽然,我看不出我的winery
解构器有什么问题。我的Linux环境将只输出name *
和location *
的值,而Windows Visual Studio将输出name *
和location *
的值,后跟:²²²²²½½½½½½½½′′′′′′
为了使这篇文章简短,我只包括负责接收name *
数据的函数和打印name *
的函数。如果你真的想运行我的整个项目,这里有一个dropbox的链接。
例如,我实际上并没有调用这个
char name[] = "Winery ";
winery item;
item.setName(name);
假设name[]
是一个字符数组,它的内存插槽比它需要的要多。
这是我的setName()
函数从我的winery.cpp文件:
void winery::setName(const char name[])
{
unsigned char count;
for (count = 0; name[count] != ' '; count++);
this->name = new char[count];
for (unsigned char i = 0; name[i] != ' '; i++)
this->name[i] = name[i];
}
现在我在我的list.cpp文件中有一个addWinery()
函数,这是我的list类的一部分,但我不打算包括它,因为我不认为它会导致问题。
对于cout
,我重载了<<
运算符:
std::ostream& operator<< (std::ostream& out, const char array[])
{
for (unsigned char i = 0; array[i] != ' '; i++)
{
out << array[i];
}
return out;
}
std::cout << "Name: " << head->item.getName() << std::endl;
在Linux下打印
Name: Winery
和Visual Studio中的
Name: Winery²²²²½½½½½½½½ϵ▮ϵ▮ϵ▮
现在,我猜这个错误是由我的winery::setName()
&winery::setLocation()
函数,虽然我看不出这两个函数有什么问题。我可能错了。
同样,你们可能会发现这更容易自己测试,所以这里有一个dropbox的链接。
如果你也能解释我的~winery()
解构器有什么问题,或者为什么我不需要这些动态分配的数组(c风格字符串),我将非常感激。
winery::setName()
不以空终止字符串