gpt4 book ai didi

c++ - 如何正确地从函数返回指针

转载 作者:行者123 更新时间:2023-11-30 03:28:44 24 4
gpt4 key购买 nike

我有以下功能:

std::wstring GetNetStatus()
{
NETSETUP_JOIN_STATUS bufType;
::ZeroMemory(&bufType, sizeof(NETSETUP_JOIN_STATUS));

LPWSTR buf;
CHECK_OS_ERROR(::NetGetJoinInformation(nullptr, &buf, &bufType) == NERR_Success);

std::wstring group(buf);
::NetApiBufferFree(buf);

return group;
}

我需要返回一个 LPWSTR 值,但根据我使用的 API,我需要在离开函数范围之前释放此指针。

LPWSTR 值分配给 STL 字符串并返回它是否正确,还是有其他一些技巧?

最佳答案

您展示的内容在技术上是正确的。

但是,请注意,当 std::wstringbuf 复制字符数据时,它有可能抛出一个异常,因此您应该准备好处理该异常以避免任何可能的内存泄漏。

你可以使用__try/__finally:

std::wstring GetNetStatus()
{
std::wstring result;

NETSETUP_JOIN_STATUS bufType;
::ZeroMemory(&bufType, sizeof(NETSETUP_JOIN_STATUS));

LPWSTR buf;
CHECK_OS_ERROR(::NetGetJoinInformation(nullptr, &buf, &bufType) == NERR_Success);

try {
result = buf;
}
__finally {
::NetApiBufferFree(buf);
}

return result;
}

或者,您可以编写一个遵循 RAII 语义的自定义 class/struct:

template <typename T>
class NetApiBuffer
{
private:
T* m_buf;

NetApiBuffer(const NetApiBuffer &) {}
NetApiBuffer& operator=(const NetApiBuffer &) { return *this; }

public:
NetApiBuffer(T *buf = 0) : m_buf(buf) {}

~NetApiBuffer() {
::NetApiBufferFree(m_buf);
}

operator T*() { return m_buf; }
T** operator&() { return &m_buf; }
};

std::wstring GetNetStatus()
{
NETSETUP_JOIN_STATUS bufType;
::ZeroMemory(&bufType, sizeof(NETSETUP_JOIN_STATUS));

NetApiBuffer<WCHAR> buf;
CHECK_OS_ERROR(::NetGetJoinInformation(nullptr, &buf, &bufType) == NERR_Success);

return std::wstring(buf);
}

或者,如果您使用的是 C++11 或更高版本,则可以将 std::unique_ptr 与自定义删除器一起使用:

std::wstring GetNetStatus()
{
NETSETUP_JOIN_STATUS bufType;
::ZeroMemory(&bufType, sizeof(NETSETUP_JOIN_STATUS));

LPWSTR buf;
CHECK_OS_ERROR(::NetGetJoinInformation(nullptr, &buf, &bufType) == NERR_Success);

std::unique_ptr<WCHAR, decltype(&::NetApiBufferFree)> deleter(buf, &::NetApiBufferFree);
return std::wstring(buf);
}

关于c++ - 如何正确地从函数返回指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46328311/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com