【问题标题】:Is something wrong with wrapper classes for C string functions?C 字符串函数的包装类有问题吗?
【发布时间】:2011-08-04 09:46:06
【问题描述】:

我有一些用 C 风格编写的 C++ 代码。
由于某些原因,我不能使用 C++ 字符串和 IO 库,因此对于字符串处理,我应该只使用 sprintfitoa 等函数。

我想替换需要临时缓冲区的 C 样式 字符缓冲区[12]; itoa(x, buf, 16); set_some_text(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));

(这样的类可以写成char<->wchar_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* 变量。

有没有办法让这些类更安全?


更新:为什么不使用 std::string、boost::lexical_cast、boost::format 等:
该代码在使用 -fno-except 编译时应该可以工作(禁用 C++ 异常 - 没有 throw,没有堆栈展开)。它还应该在内存不足的情况下继续工作。
std::string,流使用堆分配的内存,至少会抛出 bad_alloc
当我们没有可用的堆内存时,通常我们仍然有几千字节的堆栈(例如写给用户我们的内存不足,然后进行适当的清理)。

【问题讨论】:

  • 如果您有一个非常奇怪的系统,以至于您甚至无法使用最基本的 C++ 类,请更具体一些。大多数明显的解决方案都会在非 C++ 系统上失效。
  • "i2a someMeaningfulName(x);" i2a 这里是什么?另一个班级?
  • @rageshctech 哦,谢谢,它是同一类。 (修复)

标签: c++


【解决方案1】:

ATL 和 MFC 字符串转换宏也是以这种方式编写的。像i2a(x) 这样直接调用构造函数将创建一个临时对象,该对象将一直存在到传递给它的函数完成为止。所以在这里:do_some(i2a(x)),临时对象将一直存在,直到do_some() 完成。

请参阅此msdn document

示例部分(示例 2

这里,

const char* someMeaningfulName = i2a(x);
set_some_text(someMeaningfulName);

这不起作用,因为临时对象将在第一条语句本身上被释放。 someMeaningfulName 将是垃圾。如果你觉得缺乏安全感,我只能说:

这就是微软的做法!

【讨论】:

  • 如果有更好/更安全的方法就好了,我同意!
【解决方案2】:

如果您使用 const char* 作为局部变量,您总会遇到麻烦。 const char* someMeaningfulName = std::string("foo").c_str();

如果可以的话,你应该像这样声明你的局部变量:

i2a someMeaningfulName(x);
set_some_text(someMeaningfulName);

您还可以考虑向 i2a 添加一个复制构造函数,以避免在两个实例之间共享缓冲区。

【讨论】:

    猜你喜欢
    • 2017-08-26
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2012-04-23
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多