1

我正在尝试调整动态分配的字符串数组的大小;这是代码!

void resize_array() {
    size_t newSize = hash_array_length + 100;
    string* newArr = new string[newSize];

    fill_n(hash_array,newSize,"0"); //fills arrays with zeros

    memcpy( newArr, hash_array, hash_array_length * sizeof(string) );

    hash_array_length = newSize;
    delete [] hash_array;
    hash_array = newArr;
}

不幸的是,它不起作用并给出了分段错误。知道为什么吗?这基本上是一个线性探测哈希表,其中元素被插入到任何有 0 的地方,因此我使用 fill_n 用 0 填充新创建的数组。请问有什么帮助吗?

4

3 回答 3

4
memcpy( newArr, hash_array, hash_array_length * sizeof(string) );

这一行非常危险,std::string 不是普通的旧数据类型,您无法确保 memcpy 可以正确初始化它,它可能会导致未定义的行为,这是 c++(或编程)中最讨厌的行为之一。

此外,在 C++ 中创建动态字符串数组有更好、更安全(在大多数情况下)的解决方案,只需使用向量

//create a dynamic string array with newSize and initialize them with "0"
//in your case, I don't think you need to initialize it with "0"
std::vector<std::string> newArr(newSize, "0"); 

如果 hash_array 的类型与 newArr(std::vector) 相同,那么复制的方式就很简单了。

C++98

std::copy(hash_array.begin(), hash_array.end(), newArr.begin());

c++11

std::copy(std::begin(hash_array), std::end(hash_array), std::begin(newArr));

不如把c++当成一门新语言,它有太多和c不同的地方。此外,还有很多不错的免费 IDE,比如 code::blocks 和 QtCreator devc++ 是一个几乎死掉的项目。

如果您是 C++ 新手,C++ Primer 5 是一本不错的入门书籍。

于 2013-03-31T21:15:14.990 回答
1

如果string实际上是std::string(并且可能即使不是),那么这将崩溃。您正在创建一个新的字符串数组,将旧的字符串类复制到顶部,然后释放旧的字符串。但是,如果字符串类包含指向已分配内存的内部指针,这将导致双重释放,因为您所做的只是复制内部指针 - 而不是进行新的内存分配。

这样想;假设您有以下课程:

class foo
{
    char* bar;

    foo() { bar = malloc(100); }
    ~foo() { free(bar);
};

foo* ptr1 = new foo;
foo* ptr2 = new foo;
memcpy(ptr2, ptr1, sizeof(foo*));
delete ptr1;

此时,ptr2->bar指向相同的内存ptr1->bar,但ptr1它持有的内存已被释放

最好的解决方案是使用 astd::vector因为它会自动处理大小调整,您根本不需要担心复制数组。但是,如果您想坚持当前的方法,则需要将memcpy调用更改为以下内容:

for (int i = 0; i < hash_array_length; ++i)
{
    newArr[i] = hash_array[i];
}

这将调用类的复制构造函数并对其内容进行适当的复制,而不是仅仅复制内存。

于 2013-03-31T21:19:00.783 回答
0

我怀疑罪魁祸首是memcpy电话。string是通过指针管理 char 数组的复杂类型(就像您现在所做的那样)。通常复制字符串是使用赋值运算符完成的,对于字符串也复制它自己的数组。但是 memcpy 只是逐字节地复制指针,而 delete[] 也删除了由字符串管理的数组。现在另一个字符串使用已删除的字符串数组,即 BAAAD。

您可以使用 std::copy 代替 memcpy,或者更好的是使用 std::vector,它可以解决大多数动态内存处理问题。

于 2013-03-31T21:23:06.740 回答