【发布时间】:2012-07-11 11:38:20
【问题描述】:
我们有一个大型 C++ 实时程序,它使用不同大小的缓冲区(例如 char str[500])来存储字符串。
由于过去发生了一些内存泄漏,我们希望使用 MyString 类包装字符串,该类将使用缓冲区和大小进行初始化。
问题在于如何高效、轻松地同时分配缓冲区和包装器,同时保持缓冲区作为类的一部分分配,而不是从堆中分配(参见下一个示例)。
我尝试过以下方式使用模板:
template <unsigned int N>
class BufferString : public MyString
{
public:
BufferString() : MyString(m_buf, N) { }
char m_buf[N];
};
所以它可以分配为类成员或自动变量:
class SomeClass
{
BufferString<500> m_str; // Need the buffer to be allocated in SomeClass
};
void foo()
{
BufferString<350> str; // Need the buffer to be allocated on the stack
}
但是,使用此解决方案,可执行文件的大小会急剧增加,每次模板实例化大约 1kB(可能是由于构造函数的编译)。
有没有更好的方法来做到这一点?
谢谢。
编辑:我找到了一个类似于我提出的解决方案的实现,称为 fixed_char_buf(由 John Panzer,发现 here)。
这个方法的另一个实现和推理在here找到。
【问题讨论】:
-
你不能用
std::string吗? -
不要让你的实现适应任何内存泄漏问题,就像你写的那样,你有。先解决内存泄漏问题,再充分利用动态内存分配。
-
有什么特殊要求为什么不能在堆上分配?您提供的解决方案是 IMO 唯一能够在堆栈上分配它的解决方案。那时你将不得不忍受尺寸上的缺点。
-
旁注:不要使用
__buf之类的名称,以两个下划线开头。他们是reserved。 -
@DesmondHume 当然我修复了我发现的内存问题,但为了确保它们不会重复,我想添加一些保护机制。我们没有使用动态分配,因为在实时应用程序中分配非常耗时。