C字符串函数的包装类有问题吗? 我有一些C++风格的C++代码。 由于某些原因,我不能使用C++字符串和IO库,所以对于字符串处理,我只需要使用函数如 SpReFTF < /C>, ITOA < /C> >等> < /P>

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

我想替换需要临时缓冲区的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(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);