为什么Windows Visual Studio会损坏C样式字符串,而Linux不会?



我有一个由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()不以空终止字符串

最新更新