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