gpt4 book ai didi

c++ - 为什么我不能 memmove std::string?

转载 作者:行者123 更新时间:2023-11-28 03:15:43 25 4
gpt4 key购买 nike

#include <cstdlib>
#include <cstring>
#include <string>

using std::string;

string *arr_ptr;
int capacity;

void add() {
int old_capacity = capacity;
capacity <<= 1;
// double the capacity
string *tmp_ptr = new string[capacity];
// apply new space
memmove(tmp_ptr, arr_ptr, sizeof(string) * old_capacity);
// copy
delete[] arr_ptr;
// free the original space
arr_ptr = tmp_ptr;

arr_ptr[capacity - 1] = "occupied";
// without this statement, everything "seems" to be fine.
}

int main() {
arr_ptr = new string[1];
capacity = 1;
for (int i = 0; i < 3; i++) add();
}

运行代码。如您所见,程序在调用字符串的析构函数时崩溃。尝试注释掉delete这一行,再检查一下。

我怀疑 std::string 保留了它自己的一些地址信息。当它在内存中的位置发生变化时,它不会收到通知。

此外,由于 memmove 并不总是按预期工作,在 C++ 中复制类实例数组的适当表达式是什么?

最佳答案

memmove是用于复制字节的低级函数。这意味着字节数组的值被复制到另一个数组。这适用于 POD数据,而不是其他任何东西。原因是类可以有一个复制构造函数,它不会被 memmove 调用,并且类可以有额外的数据,比如用于调用虚拟成员函数的 vpointer。

最简单的解决方案是替换 memmovestd::copy for ( #include <algorithm> ) 复制条目而不是字节:

std::copy(arr_ptr, arr_ptr + old_capacity, tmp_ptr);

关于c++ - 为什么我不能 memmove std::string?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16955142/

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