诡异的C++引用问题

C++语言 码拜 5年前 (2016-04-27) 474次浏览
本人尝试在VS2015社区版中写一个包装指针的类,然而。
class data_t{
data_t(const wstr_t& str):m_data( (void*) (new wstr_t (str) ) ){}
inline operator wstr_t& const() { return *(wstr_t*)(m_data); }
private:
void* m_data;
};
class wstr_t {
wstr_t(const wchar_t* ws) {
size_t size = wcslen(ws) + 1;
m_str = new wchar_t[size]();
wcsncpy(m_str, ws, size);
}
~wstr_t(){ delete[] m_str;}
wchar_t *m_str;
};
问题在main.cc中
int main(){
wstr_t aaa=L”1234″;
data_t bbb=aaa;
//wstr_t ccc=bbb;//vs 编译有问题,开始这一句编译说类型不能转换
//wstr_t ccc=bbb.operator wstr_t();//这句ok,但太繁琐
wstr_t ccc(bbb);//问题是这一句,上面一样有这个问题
wprintf(“%ls”, ccc.m_str);//为简化,实际需要getter()方法
return 0;
}
编译正常,运行时报delete[][ m_str指针错误
经调试,运行正常,直到返回引用时报错,加调试信息。发现wstr_t两次构造函数,两个析构,析构this地址为00000000
测试指针转换一切正常(static_cast一样), *(wstr_t*)m_data地址正确
对引用搞不懂了,莫非只能返回 wstr_t const * const 指针了吗?不能写丑陋的bbb->m_str
解决方案

20

用std::unique_str<T> ptr;
C++11帮你自动封装好了

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明诡异的C++引用问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)