【发布时间】:2016-06-07 11:44:35
【问题描述】:
我正在替换以下语句:
auto pszOutBuffer = new char[dwSize];
ReadDataFromHttp(pszOutBuffer, dwSize);
if(dwSize>100)
ParseHttpData(pszOutBuffer);
...
delete []pszOutBuffer;
到:
auto OutBufferPtr = make_unique<char[]>(dwSize);
auto pszOutBuffer = OutBufferPtr.get();
ReadDataFromHttp(pszOutBuffer, dwSize);
if(dwSize>100)
ParseHttpData(pszOutBuffer);
...
这样我就可以利用智能指针unique_ptr。我想保留变量 pszOutBuffer,这样 Git 提交中的更改就会更少,并且不需要重复 unique_ptr.get()。
为了使这个简单,并且阅读起来不那么冗长;我想过编写一个宏 MAKE_UNIQUE_PTR(type,size),它将是一个语句(不是两个如上所示)。但是这样的宏将无法拥有unqiue_ptr 和pszOutBuffer,如:
auto pszOutBuffer = MAKE_UNIQUE_PTR(char, dwSize);
我可能会考虑写一个函数模板,但是……如何在函数(MAKE_UNIQUE_PTR)返回后保持unique_ptr?
编辑:
有了这个假设的宏/函数,代码就是:
auto pszOutBuffer = MAKE_UNIQUE_PTR(char, dwSize);
ReadDataFromHttp(pszOutBuffer, dwSize);
if(dwSize>100)
ParseHttpData(pszOutBuffer);
...
具有这些优势:
-
unique_ptr仍然控制着缓冲区的生命周期。 - 原始样式指针仍然存在,而不会将它们更改为
unique_ptr::get()调用。 - 因此可以安全地从多个代码路径中删除
delete[]调用。
请注意,第一个代码是我手头的代码。没有宏,没有unique_ptr——只有具有new 和delete 的遗留代码。是的……那些匈牙利符号变量。
【问题讨论】:
-
不确定是否离题...为什么
dwSize + 1?您的 memset 超出了pszOutBuffer的范围,这将导致 UB。 -
坚持你所拥有的——任何人都容易理解。并非一切都是代码高尔夫。
-
@Ajay 不,只是写出
auto OutBufferPtr = make_unique<char[]>(dwSize); -
每当您想到“动态数组”时,您接下来应该想到
std::vector。所以不要打扰指针,不管聪明与否,改用std::vector。 -
这是一个意见......但我认为有一些优先事项混淆了。你想为了更简单的 git 历史而牺牲可读性和可维护性......你真的确定吗? 您正在为
auto变量使用匈牙利符号,这是一个很大的“什么鬼”,除此之外,您还可以将它与宏结合使用。想想更典型的用例,git 历史浏览与实际代码阅读。 PS。人们会选择“XY”,因为这似乎是一个实际问题,并且您会努力寻找合适的解决方案,因此他们关心质量。
标签: c++ c++11 c++14 unique-ptr