我希望这个问题不是太主观。我想要的是一个好的设计,可以防止我的代码后期发生内存泄漏。我找不到任何关于SO的问题。我总是发现有关在功能中分配数据后该怎么做的问题,这不是我的情况。
由于某些原因,我没有使用像C ++ 11(共享指针)这样的新C ++标准。
让我举例说明:
我有数据缓冲的逻辑,后来被发送。缓冲是在一个班级完成并发送到另一个班级。
在一个代码点,我从缓冲区获取一些数据,处理它(检查数据类型等),然后用函数send发送它:
bool send_data(char *data, size_t data_length) {
数据已消耗且不再需要。我可以在send_data或shell中将它们释放给调用者吗?
在里面释放它:
bool send_data(char *data, size_t data_length) {
//... process data ...
send(data, data_length, ...);
delete[] data;
}
离开它,让来电者释放它:
send_data(data,data_length);
delete[] data;
或者是否存在设计缺陷,我应该做一些完全不同的事情?
不使用C ++ 11的原因是代码很大&旧的 - 我应该完全改写它吗?但我正在考虑重写代码的某些部分,因为有些东西比没有好。
而且一些指针的使用跨越了许多代码,我必须更改它们。有时候找到它们并不容易,因为使用可能会被投射和缓冲等隐藏。
数据缓冲非常重要。我在缓冲区中有很多数据,而不仅仅是一个char数组。我不确定数据是否可以保持静态,因为你们中的一些人有答案。我会考虑它。
答案 0 :(得分:3)
如果您不想使用c ++ 11,可以使用std::auto_ptr
,或者如果您真的可以使用std::unique_ptr
。
但正如我所看到的,似乎你正在使用char *
,可能是一个数组。如果是这样,请不要使用智能指针(至少没有自定义解除分配器)并调用delete[]
而不是delete
。
此外,如果您需要传递char *,则可以使用
std::vector<char> vec;
vec.push_back(...);
//...
send_data(&vec[0], vec.size());
如果您确定强烈要使用char *
,请在调用者中删除它,这是更好的做法。因为谁分配内存是它的所有者,所以所有者删除它。它还消除了被调用者的副作用,并使被调用者更容易被其他开发人员使用,他们不会期望,send_data
也将delete
他们的数据。
答案 1 :(得分:1)
如果你想要好的设计来防止内存泄漏, 的答案就是使用容器,并且有很多容器可供选择,不需要C ++ 11。如果你希望它尽可能地成为“自由形式的原始数据”,那么是的,你应该使用更新的标准并使用独特的或共享的指针 - 你有没有特别的理由在编译方面过去十年仍然停滞不前? / p>
如果你想以C方式处理它(这是你坚持上面做的那样),那么它确实是依赖于应用程序的。如果您遇到以下限制:
1)一次只有一个线程会使用这些数据 2)数据大小永远不会过高 3)没有别的办法可以让它坚持下去是不合理的
...然后我建议将它存储在静态指针中,其中没有人需要释放它。这就是很多stdlib库函数在处理字符串时所做的事情。
答案 2 :(得分:1)
C ++风格是使用安全的ptr包装器。
C风格,就像这里一样,意味着绝对将它留给来电者。
电话可能是:
char data[256];
...
send(data, sizeof(data);
所以没有delete[] data
为了更安全,您可以隐藏原始send
并分别管理数据及其删除。 C ++作为类,C风格作为几个函数。
struct Data {
char* data;
size_t size;
};
void send(struct Data* data) {
if (!data->data) {
throw new IllegalStateException("...");
}
_send(data->data, data->size);
delete[] data->data;
data->data = NULL;
}