【问题标题】:Is this correct use of new and delete - c++ [duplicate]这是正确使用new和delete - c ++ [重复]
【发布时间】:2021-12-20 03:17:17
【问题描述】:

由于我是新手,我只是想问问更有经验的 C++ 程序员这是一个很好的 C++ 实践吗?我有一个返回*char 的函数。这个函数在dll中。

我已经定义了全局*char 变量,这就是返回的内容。我将 libcurl 用于 POST 请求方法。由于每个响应的长度不同,我使用的是new。在使用new的时候,也需要使用delete,我想检查一下我使用delete和pointer是否正确?

char *response

struct MemoryStruct {
char *memory;
size_t size;
};

char *function() {
    //...
    // libcurl code
    //...
    
    // is this part of a code a good practice?
    if (response == nulptr) {
        response = new char[cunk.size];
        memcpy(response, chunk.memory, chunk.size);
    } else {
        delete[] response;
        response = new char[chunk.size];
        memcpy(response, chunk.memory, chunk.size);
    }
    
    //...
    // libcurl cleanup
    //...
    
    return response;
}

这样可以吗,还是有其他(更好的)方法可以做到这一点?

感谢您的帮助。

编辑:我忘了提到结果不是返回给 C++,而是返回给 Clarion。所以我不能使用智能指针或字符串。

【问题讨论】:

  • “好的做法”是使用诸如std::string 之类的包装器来处理内存管理。为什么你需要使用原始的char*
  • 您根本不需要if。总是delete[] response;。可以delete[] 一个空指针。 (但实际上,您应该使用std::unique_ptr。)
  • response 是一个全球性的没有明确的理由。从function() 返回的值和response 中存储的值似乎相同?其他代码可以查看其中一个而忽略另一个?

标签: c++


【解决方案1】:

不,这不是好的 C++ 做法。

通常的约定是永远不要使用原始指针作为所有权。这意味着response 和返回类型都应该是std::unique_ptr

全局response 有什么意义?这样用户就不必删除内存了,对吧?上面的段落解决了这个问题。使用这些隐藏的全局变量时要非常小心,该函数不再是可重入的,也不是线程安全的。 responsefunc 的两个并行调用的返回值会发生什么?当然没有什么好。

即使是 POSIX 也不再使用像 strtok 这样具有内部隐藏持久状态的函数,并用 strtok_r 安全版本替换它们。

【讨论】:

    【解决方案2】:

    应该就是这么简单:

    • 没有新建/删除
    • 没有内存
    • 没有全局变量

    #include <string>
    #include <iostream>
    
    std::string function()
    {
        // libcurl stuff
        const char* chunk{ "Hello world!" };
    
        std::string response{ chunk };
        return response;
    }
    
    int main()
    {
        auto response = function();
        std::cout << response;
        return 0;
    }
    

    【讨论】:

    • 同意。并且没有 dll 的
    猜你喜欢
    • 1970-01-01
    • 2017-12-07
    • 2013-03-12
    • 2023-03-22
    • 1970-01-01
    • 2018-01-22
    • 2012-10-26
    • 1970-01-01
    • 2016-09-02
    相关资源
    最近更新 更多