2012-04-22 66 views
2

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

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

sptr.reset(""); 
sptr.reset(nptr); 

编辑 -

我想我已经想通了。在重置时,智能指针试图删除并清空字符数组(“”),由于没有使用新操作符,因此未分配到堆上(ahem !!?!!?!???!?!)。因此,当程序试图释放内存时,这个程序会崩溃。所以纠正我,如果我错了,但字符串本身会存储在程序的可执行字节流本身?如果是这样,仅供将来参考,是否有强制分配新字符串的方法?

回答

0

您在识别错误​​时是正确的。 scoped_array将在其所持的对象上调用delete[];毕竟,这是它存在的唯一目的。你不能delete[]东西不是new[]'d,或者你得到未定义的行为。

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