_BLOCK_TYPE_IS_VALID 在提升::scoped_array 上出错

_BLOCK_TYPE_IS_VALID error on boost::scoped_array

本文关键字:scoped array 出错 BLOCK TYPE IS VALID      更新时间:2023-10-16

经过大量的挖掘和搜索,我找到了问题的根源。从本质上讲,此代码被执行,并且在它自己的项目中会导致相同的错误。我看到我无法将智能指针重置为新字符串...但是为什么?还有没有一个简单的方法可以解决这个问题?

scoped_array<char> sptr;
char* nptr = "Hello";
sptr.reset("");
sptr.reset(nptr);

编辑-

我想我已经想通了。重置时,智能指针尝试删除并清空字符数组 ("),由于未使用新运算符,因此未在堆上分配字符数组 (ahem !?!!?!???!?!)。因此,该程序在尝试释放内存时会严重中断。因此,如果我错了,请纠正我,但字符串本身会存储在程序的可执行字节流本身中吗?如果是这样,仅供将来参考,有没有办法强制分配新字符串?

您识别错误是正确的。 scoped_array会调用它所持有的对象delete[];毕竟,这是它存在的唯一目的。你不能delete[]一些没有new[]'d的东西,否则你会得到未定义的行为。

但是,如果需要动态字符串,则应仅使用 std::string。您尝试创建的任何内容都允许scoped_array<char>像字符串一样行事,最终都会成为std::string的劣质版本。然后就很简单:std::string s; s = ""; s = "Hello".