这是正确使用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
有什么意义?这样用户就不必删除内存了,对吧?上面的段落解决了这个问题。使用这些隐藏的全局变量时要非常小心,该函数不再是可重入的,也不是线程安全的。 response
和 func
的两个并行调用的返回值会发生什么?当然没有什么好。
即使是 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 ++ [重复]的主要内容,如果未能解决你的问题,请参考以下文章