这是正确使用new和delete - c ++ [重复]

Posted

技术标签:

【中文标题】这是正确使用new和delete - c ++ [重复]【英文标题】:Is this correct use of new and delete - c++ [duplicate] 【发布时间】: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 中存储的值似乎相同?其他代码可以查看其中一个而忽略另一个? 【参考方案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 的

以上是关于这是正确使用new和delete - c ++ [重复]的主要内容,如果未能解决你的问题,请参考以下文章

new和delete运算符 c/c++

如何正确替换全局new和delete运算符

C++ - 创建类对象向量时使用删除的正确方法

C++Geekband - 专题一:new和delete的整理

c++中new和delete的用法

c++基础_ new, delete概述及其使用!!