调整动态字符串数组的大小
Resizing dynamic string array
我正在尝试调整动态分配的字符串数组的大小;下面是代码!
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来填充新创建的数组。请帮忙好吗?
memcpy( newArr, hash_array, hash_array_length * sizeof(string) );
这一行非常危险,std::string不是普通的旧数据类型,你不能确保memcpy可以正确地初始化它,这可能会导致未定义行为,c++(或编程)中最讨厌的行为之一。
此外,有一个更好的和更安全的(在大多数时候)解决方案来创建c++中的动态字符串数组,只需使用vector
//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++ 98std::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和QtCreatordevc++几乎是一个死项目。
如果你是c++新手,c++ primer 5是一本很好的入门书。
如果string
实际上是std::string
(即使它不是),那么这将崩溃。您正在创建一个新的字符串数组,在上面复制旧的字符串类,然后释放旧的字符串。但是,如果string类包含指向已分配内存的内部指针,这将导致double free,因为您所做的只是复制内部指针,而不是分配新的内存。
这样想;假设您有以下类:
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
和它所持有的内存已经被释放
最好的解决方案是使用std::vector
,因为它可以自动处理大小调整,您根本不需要担心复制数组。但是,如果您想坚持当前的方法,则需要将memcpy
调用更改为以下内容:
for (int i = 0; i < hash_array_length; ++i)
{
newArr[i] = hash_array[i];
}
不只是复制内存,这将调用类的复制构造函数,并对其内容进行适当的复制。
我怀疑罪魁祸首是memcpy
呼叫。string
是一个复杂的类型,它通过指针来管理char数组(就像你现在所做的那样)。通常复制string是使用赋值操作符完成的,对于string,赋值操作符也会复制它自己的数组。但是memcpy只是逐字节复制指针,delete[]也删除由string管理的数组。现在另一个字符串使用已删除的字符串数组,即BAAAD。
您可以使用std::copy来代替memcpy,或者更好的是,使用std::vector,这是解决大多数动态内存处理问题的方法。
- std::向量与传递值的动态数组
- 将数组动态分配到具有指针参数的函数中
- 我可以以某种方式使我的矢量/数组动态更改装置数量吗?
- 使用 new: "potentially uninitialized pointer"将对象数组动态分配给指针
- 为什么C 没有方便的方式来为多维数组动态分配内存
- 如何制作具有动态大小的数组?动态数组的一般用法(可能还有指针)
- c++中的数组动态内存分配
- 多维数组动态分配的内存图
- 如何在 c++ 中使用 2-D 固定数组为 4-D 数组动态分配内存
- C++ 我在数组/动态内存方面遇到了一些问题
- C++ 中从数组动态强制转换
- C++中高维数组动态内存分配的正确方法.
- 从 C++ 结构中包含的指针数组动态分配和访问内存
- 对象数组动态内存分配
- 为二维数组动态分配内存时出错
- 如何将2d数组动态分配给结构
- 为结构数组c++动态分配内存
- 将数组动态添加到多维数组
- 类中的类数组-动态数组(c++)有问题
- 分配对象数组动态冻结