C++ _块类型是boost::作用域数组上的有效错误

C++ _块类型是boost::作用域数组上的有效错误,c++,boost,smart-pointers,scoped-ptr,C++,Boost,Smart Pointers,Scoped Ptr,经过大量的挖掘和搜索,我找到了问题的根源。本质上,这段代码是执行的,在它自己的项目中,它会导致相同的错误。我发现我无法将智能指针重置为新字符串…但为什么?还有一个简单的方法吗 scoped_array<char> sptr; char* nptr = "Hello"; sptr.reset(""); sptr.reset(nptr); scoped_数组sptr; char*nptr=“你好”; sptr.重置(“”); sptr.重置(nptr); 编辑- 我想我已经明白了。

经过大量的挖掘和搜索,我找到了问题的根源。本质上,这段代码是执行的,在它自己的项目中,它会导致相同的错误。我发现我无法将智能指针重置为新字符串…但为什么?还有一个简单的方法吗

scoped_array<char> sptr;
char* nptr = "Hello";

sptr.reset("");
sptr.reset(nptr);
scoped_数组sptr;
char*nptr=“你好”;
sptr.重置(“”);
sptr.重置(nptr);
编辑-


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

您识别错误是正确的
scoped_数组
将调用它所持有的对象上的
delete[]
;毕竟,这是它存在的唯一目的。您不能
删除[]
新[]'d
的内容,否则您将获得未定义的行为


但是,如果需要动态字符串,您应该只使用
std::string
。您试图创建的任何允许
作用域_数组
像字符串一样工作的东西,最终都会成为
std::string
的劣质版本。然后它就简单到:
std::string s;s=“”;s=“Hello”

您识别错误的方法是正确的
scoped_数组
将调用它所持有的对象上的
delete[]
;毕竟,这是它存在的唯一目的。您不能
删除[]
新[]'d
的内容,否则您将获得未定义的行为

但是,如果需要动态字符串,您应该只使用
std::string
。您试图创建的任何允许
作用域_数组
像字符串一样工作的东西,最终都会成为
std::string
的劣质版本。然后它就简单到:
std::string s;s=“”;s=“你好”