bag*_*age 3 c++ string valgrind cout strcpy
我正在编写我的String类的版本,但Valgrind抱怨<<我的字符串操作符的实现.错误是在错误的行,如果我通过char打印char它工作得很好.
我哪里错了?
Valgrind错误:
== 2769 ==有条件的跳转或移动取决于未初始化的值(s)
== 2769 ==在0x4C2AC28:strlen(在/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so中)
== 2769 == by 0x4ECAD60:std :: basic_ostream>&std :: operator <<>(std :: basic_ostream>&,char const*)(在/usr/lib/x86_64-linux-gnu/libstdc++.so中. 6.0.17)
== 2769 == by 0x400BD5:operator <<(std :: ostream&,String&)(string.cpp:22)
== 2769 == by 0x400AAC:main(main.cpp:12)
我<<的字符串运算符:
ostream & operator << (ostream & o, String & inS) {
o << inS._pData << " "; // the wrong line
return o;
}
Run Code Online (Sandbox Code Playgroud)
我的String班级:
class String {
public:
unsigned _size;
char * _pData;
String();
String(const char* inCString);
};
Run Code Online (Sandbox Code Playgroud)
构造函数(for char*):
String::String(const char* inCString) {
_size = strlen(inCString);
_pData = new char[_size + 1];
strncpy(_pData, inCString, _size);
}
Run Code Online (Sandbox Code Playgroud)
Main.cpp的:
int main(int, char**) {
String s1("hello");
cout << s1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
seh*_*ehe 10
我不建议使用这样的原始字符串.
然而,罪魁祸首在这里:
strncpy(_pData, inCString, _size+1);
Run Code Online (Sandbox Code Playgroud)
或者,也可以手动存储NUL终止字符:
_pData[_size] = 0;
Run Code Online (Sandbox Code Playgroud)
通过缺少NUL终止字符,输出操作将继续运行超过字符串的结尾.(行为可能看起来没问题,因为角色可能是偶然的,取决于编译器,选项等)
暗示:
char*,至少使用stdrup和free如果你坚持做NUL终止的字符串,考虑写C++方式:
#include <iostream>
#include <vector>
class String
{
public:
std::vector<char> _data;
String();
String(const char* inCString);
};
std::ostream & operator << (std::ostream & o, String const& inS)
{
o.write(inS._data.data(), inS._data.size());
return o << ' ';
}
String::String(const char* inCString)
{
for (const char* it=inCString; it && *it; ++it)
_data.push_back(*it);
}
int main(int, char**)
{
String s1("hello");
std::cout << s1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
920 次 |
| 最近记录: |