Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调整动态分配的内存大小C++;用ASSERT"_块“类型”为“有效(pHead->;nBlockUse)”;_C++ - Fatal编程技术网

C++ 调整动态分配的内存大小C++;用ASSERT"_块“类型”为“有效(pHead->;nBlockUse)”;

C++ 调整动态分配的内存大小C++;用ASSERT"_块“类型”为“有效(pHead->;nBlockUse)”;,c++,C++,嗨,我正在写一些代码,可以动态调整分配的内存大小。 这是我代码的一部分 初始化: int size = 1; string *rev = new string[size]; 调整部件大小: if (j >= size / 2){ size = size * 2; string *temp = rev; rev = new string[size]; memcpy(rev, temp, (size / 2)*sizeof(string)); dele

嗨,我正在写一些代码,可以动态调整分配的内存大小。 这是我代码的一部分 初始化:

int size = 1;
string *rev = new string[size];
调整部件大小:

if (j >= size / 2){
    size = size * 2;
    string *temp = rev;
    rev = new string[size];
    memcpy(rev, temp, (size / 2)*sizeof(string));
    delete[] temp;            //  <- here causes the error!
}
如果(j>=size/2){
尺寸=尺寸*2;
字符串*temp=rev;
rev=新字符串[大小];
memcpy(版本、温度(尺寸/2)*尺寸(字符串));
删除[]温度;//=size/2){
尺寸=尺寸*2;
字符串*temp=rev;
rev=新字符串[大小];
memcpy(版本、温度(尺寸/2)*尺寸(字符串));
删除[]临时;
}
rev[j]=str;

cout它失败的原因是,您正在使用
memcpy
复制
std::string
std::string
不是pod类型,无法安全地按位复制,必须使用赋值运算符或复制构造函数进行复制

更好的解决方案是使用标准容器,如
std::vector
std::deque
来处理大小调整和正确复制

您还可以使用
std::stringstream
将单词拆分并存储在容器中,从而大大简化算法,但我假设这是一个赋值,不想完全重写函数,因此我将向您展示修复问题所需的最低限度

而不是:

memcpy(rev, temp, (size / 2)*sizeof(std::string));
使用以下命令:

for(int i = 0; i < size / 2; ++i)
{
    rev[i] = temp[i];
}
for(int i=0;i
它失败的原因是您正在使用
memcpy
复制
std::string
std::string
不是pod类型,无法安全地按位复制,您必须使用赋值运算符或复制构造函数来复制它

更好的解决方案是使用标准容器,如
std::vector
std::deque
来处理大小调整和正确复制

您还可以使用
std::stringstream
将单词拆分并存储在容器中,从而大大简化算法,但我假设这是一个赋值,不想完全重写函数,因此我将向您展示修复问题所需的最低限度

而不是:

memcpy(rev, temp, (size / 2)*sizeof(std::string));
使用以下命令:

for(int i = 0; i < size / 2; ++i)
{
    rev[i] = temp[i];
}
for(int i=0;i
你为什么要使用memcpy?字符串不是一个pod。@退休忍者,好的,谢谢你指出这一点,我稍后会研究,但你认为这是导致断言的问题吗?@user3781833'但是你认为这是导致断言的问题吗?'这很可能是原因,是的。这里有一种可能是它在许多可能性中出错的原因ties:假设您调整了两次大小。由于您复制了字符串中的指针,然后销毁了原始指针,它们指向的内存将被释放。下次调整相同内存的大小时,将再次删除。@Retired Ninja,我认为您是对的,当我运行代码时,第一次迭代是可以的,第二次迭代时会发生。但我没有让您明白很清楚。你能探索更多吗?你为什么要使用memcpy?字符串不是一个吊舱。@Retired Ninja,好的,谢谢你指出这一点,我稍后会研究,但你认为这是导致断言的问题吗?@user3781833'但你认为这是导致断言的问题吗?'这很可能是原因,是的。这里有一种可能的方式是w很多可能性:假设你调整了两次大小。因为你复制了字符串中的指针,然后销毁了原始指针,它们指向的内存被释放。下次调整相同内存的大小时,同样的内存会被删除。@Retired Ninja,我想你是对的,当我运行我的代码时,第一次迭代是可以的,第二次迭代时就会发生e、 但是我没有完全理解你。你能探索更多吗?谢谢,我实际上错过了你的帖子。但更好的是,我认为浅层复制不起作用,所以我用了“rev[m].assign(temp[m]);”来代替。但我错了,这相当于使用
assign
。很可能
操作符=()
内部调用
assign
。+1你是对的,我删除了我的答案,因为它是误导性的。谢谢,我实际上错过了你的帖子。但这更好,我认为浅拷贝不起作用,所以我使用了“rev[m].assign(temp[m]);”相反。但我错了。这相当于使用
assign
。很可能
operator=()
在内部调用
assign
。+1你是对的,我删除了我的答案,因为它具有误导性