经过大量的挖掘和搜索,我找到了问题的根源。本质上,这个代码被执行,并且在它自己的项目中它会导致相同的错误。我看到我无法将智能指针重置为新字符串......但为什么呢?还有一个简单的方法吗?
scoped_array<char> sptr;
char* nptr = "Hello";
sptr.reset("");
sptr.reset(nptr);
编辑 -
我想我已经明白了。在重置时,智能指针尝试删除并清空字符数组(“”),因为没有使用新的运算符,所以没有在堆上分配(哼!! !! !! ??? ??? !!!)。因此,当程序试图释放内存时,该程序将会崩溃。所以纠正我,如果我错了,但字符串本身是否会存储在程序的可执行字节流本身?如果是这样,仅供将来参考,是否有办法强制分配新字符串?
答案 0 :(得分:0)
您在识别错误时是正确的。 scoped_array
会在其持有的对象上调用delete[]
;毕竟,这是它存在的唯一目的。你不能delete[]
不是new[]'d
的东西,或者你得到未定义的行为。
但是,如果您想要动态字符串,则应该使用std::string
。您尝试创建以允许scoped_array<char>
像字符串一样行事的任何内容都将最终成为std::string
的伪劣版本。然后它就像:std::string s; s = ""; s = "Hello"
一样简单。