C字符串函数的包装类有问题吗? 我有一些C++风格的C++代码。 由于某些原因,我不能使用C++字符串和IO库,所以对于字符串处理,我只需要使用函数如 SpReFTF < /C>, ITOA < /C> >等> < /P>
我想替换需要临时缓冲区的C样式 char-buf[12]; itoa(x,buf,16); 设置一些文本(buf) 通过以下代码C字符串函数的包装类有问题吗? 我有一些C++风格的C++代码。 由于某些原因,我不能使用C++字符串和IO库,所以对于字符串处理,我只需要使用函数如 SpReFTF < /C>, ITOA < /C> >等> < /P>,c++,C++,我想替换需要临时缓冲区的C样式 char-buf[12]; itoa(x,buf,16); 设置一些文本(buf) 通过以下代码 class i2a { public: explicit i2a(int value) { ::sprintf(buf, "%d", value); } operator const char* () const { return buf; } private: char buf[12]; }; // usage: set_some_text
class i2a
{
public:
explicit i2a(int value) { ::sprintf(buf, "%d", value); }
operator const char* () const { return buf; }
private:
char buf[12];
};
// usage:
set_some_text(i2a(x));
(可以为charwchar\u t
转换等编写此类类)
我看到有些情况下,此类课程会很危险:
例如,一个人可以写
const char* someMeaningfulName = i2a(x);
// the right code should be i2a someMeaningfulName(x); or i2a someMeaningfulName = i2a(x);
set_some_text(someMeaningfulName);
在更复杂的情况下,接受文本的函数不会复制文本,而是将指向文本的指针保存在某个位置。例如,它可能是
class Foo { .... const char* p; };
Foo f(const char* text) { ... foo.p = text; return foo; }
与const char*
variable不同,它实际上是不明显的
有没有办法让这些类更安全
Upd:为什么不使用std::string、boost::lexical\u cast、boost::format等:
当使用-fno编译代码时,除了(禁用了C++异常-no
throw
,没有堆栈展开),代码应该可以工作。此外,它还应在内存不足的情况下继续工作。std::string
,streams使用堆分配的内存,并至少抛出bad\u alloc
当我们没有可用的堆内存时,通常我们仍然有一些千字节的堆栈(例如,向用户写入内存不足的信息,然后进行适当的清理)。如果对局部变量使用const char*,您总是会遇到麻烦。 const char*someMeaningfulName=std::string(“foo”).c_str()也会有相同的结果 如果可以,您应该这样声明局部变量:
i2a someMeaningfulName(x);
set_some_text(someMeaningfulName);
还可以考虑将复制构造函数添加到I2A中,以避免在两个实例之间共享缓冲区。直接调用构造函数(如
i2a(x)
将创建一个临时对象,该对象将一直存在,直到传递给它的函数完成为止。所以这里:do_some(i2a(x))
,临时对象将在那里,直到do_some()
完成
请参阅本手册的示例部分(示例2)
这里,
这将不起作用,因为临时对象将在第一条语句本身上被释放someaningname
将成为垃圾。如果你觉得缺乏安全感,我只能说:
微软就是这样做的强>
如果你有一个非常奇怪的系统,以至于你甚至不能使用最基本的C++类,请更具体。大多数明显的解决方案都会在非真正的C++系统上出现?另一门课?@rageshctech哦,谢谢,是同一门课。(修复了)如果有更好/更安全的方法就好了,我同意!
const char* someMeaningfulName = i2a(x);
set_some_text(someMeaningfulName);