C ++空闲内存传递给函数中的参数或将其留给调用者

时间:2015-12-14 09:48:34

标签: c++ memory

我希望这个问题不是太主观。我想要的是一个好的设计,可以防止我的代码后期发生内存泄漏。我找不到任何关于SO的问题。我总是发现有关在功能中分配数据后该怎么做的问题,这不是我的情况。

由于某些原因,我没有使用像C ++ 11(共享指针)这样的新C ++标准。

让我举例说明:

我有数据缓冲的逻辑,后来被发送。缓冲是在一个班级完成并发送到另一个班级。

在一个代码点,我从缓冲区获取一些数据,处理它(检查数据类型等),然后用函数send发送它:

bool send_data(char *data, size_t data_length) {

数据已消耗且不再需要。我可以在send_data或shell中将它们释放给调用者吗?

  1. 在里面释放它:

    bool send_data(char *data, size_t data_length) {
      //... process data ...
      send(data, data_length, ...);
      delete[] data;
    }
    
  2. 离开它,让来电者释放它:

    send_data(data,data_length);
    delete[] data;
    
  3. 或者是否存在设计缺陷,我应该做一些完全不同的事情?

    不使用C ++ 11的原因是代码很大&旧的 - 我应该完全改写它吗?但我正在考虑重写代码的某些部分,因为有些东西比没有好。

    而且一些指针的使用跨越了许多代码,我必须更改它们。有时候找到它们并不容易,因为使用可能会被投射和缓冲等隐藏。

    数据缓冲非常重要。我在缓冲区中有很多数据,而不仅仅是一个char数组。我不确定数据是否可以保持静态,因为你们中的一些人有答案。我会考虑它。

3 个答案:

答案 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;
}