C++ 将ostringstream转换为字符串时发生Valgrind错误

C++ 将ostringstream转换为字符串时发生Valgrind错误,c++,c++14,valgrind,ostringstream,C++,C++14,Valgrind,Ostringstream,我有以下(简化)代码: 类py_字符串{ PyObject*v; 公众: py_字符串(const std::string和str){ //看https://docs.python.org/3/c-api/unicode.html#c.PyUnicode_FromStringAndSize //字符串数据被复制到返回的对象中 v=PyUnicode_FromStringAndSize(str.data(),str.size()); } ~py_string(){ Py_XDECREF(v);

我有以下(简化)代码:


类py_字符串{
PyObject*v;
公众:
py_字符串(const std::string和str){
//看https://docs.python.org/3/c-api/unicode.html#c.PyUnicode_FromStringAndSize
//字符串数据被复制到返回的对象中
v=PyUnicode_FromStringAndSize(str.data(),str.size());
}
~py_string(){
Py_XDECREF(v);
}
py_字符串(常数py_字符串和其他){
v=其他。v;
皮尤·辛克里夫(v);
}
py_字符串(py_字符串和其他){
v=其他。v;
其他。v=空PTR;
}
};
静态py_字符串生成_样式表(){
std::ostringstream html;//html\u styles.cc:80

html@JerryJeremiah已经这样做了,正如你所说的“显而易见”你的复制构造函数、移动构造函数、析构函数等的实现?Valgrind的消息表明你没有在你的复制构造函数中复制
v
的内容。@M.Spiller我已经用这两个构造函数更新了这个问题。但是实际上,
v
只是一个普通的C指针,复制它没有什么特别之处n递增/递减语义。也许您可以注释掉
之间的行,以确认问题不在这些行中。@JerryJeremiah已经这样做了,因为commentsCan显示的是“明显的”你的复制构造函数、移动构造函数、析构函数等的实现?Valgrind的消息表明你没有在你的复制构造函数中复制
v
的内容。@M.Spiller我已经用这两个构造函数更新了这个问题。但是实际上,
v
只是一个普通的C指针,复制它没有什么特别之处n递增/递减语义。也许您可以注释掉
之间的行,以确认问题不在这些行中。
==5882== Invalid read of size 4
==5882==    at 0x544028: ??? (in /usr/bin/python3.6)
==5882==    by 0x6BBBFC2: emit() (html_styles.cc:138)
==5882==    by 0x6D4AB0F: ...
==5882==  Address 0x669b020 is 1,904 bytes inside a block of size 2,049 free'd
==5882==    at 0x4C3123B: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5882==    by 0x6BBBB82: deallocate (new_allocator.h:125)
==5882==    by 0x6BBBB82: deallocate (alloc_traits.h:462)
==5882==    by 0x6BBBB82: _M_destroy (basic_string.h:226)
==5882==    by 0x6BBBB82: _M_dispose (basic_string.h:221)
==5882==    by 0x6BBBB82: ~basic_string (basic_string.h:647)
==5882==    by 0x6BBBB82: ~basic_stringbuf (sstream:65)
==5882==    by 0x6BBBB82: ~basic_ostringstream (sstream:590)
==5882==    by 0x6BBBB82: generate_stylesheet() (html_styles.cc:80)
==5882==    by 0x6BBBF4F: emit() (html_styles.cc:138)
==5882==    by 0x6D4AB0F: ...
==5882==  Block was alloc'd at
==5882==    at 0x4C3017F: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5882==    by 0x715207C: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::reserve(unsigned long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25)
==5882==    by 0x7145CA7: std::__cxx11::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::overflow(int) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25)
==5882==    by 0x71504AA: std::basic_streambuf<char, std::char_traits<char> >::xsputn(char const*, long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25)
==5882==    by 0x7140B83: std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25)
==5882==    by 0x6BBB86A: operator<< <std::char_traits<char> > (ostream:561)
==5882==    by 0x6BBB86A: generate_stylesheet() (html_styles.cc:82)
==5882==    by 0x6BBBF4F: emit() (html_styles.cc:138)