可以直接将字符串作为参数传递会导致 C++ 中的内存泄漏吗?

Posted

技术标签:

【中文标题】可以直接将字符串作为参数传递会导致 C++ 中的内存泄漏吗?【英文标题】:Can directly passing strings as parameter cause Memory leak in C++? 【发布时间】:2013-05-28 10:12:21 【问题描述】:

在我的 MFC 应用程序中,当我在 Visual Studio 的调试模式下关闭它时,输出窗口有这样的行-

f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : 415 normal block at 0x028BC410, 21 bytes long. Data: <T  x            > 54 CD FB 78 04 00 00 00 04 00 00 00 01 00 00 00 "

当我使用分配号创建断点时,它指向代码:

if (CMFCToolBar::GetUserImages() == NULL)

    if (m_UserImages.Load(_T(".\\UserImages.bmp"))) //call-stack points to this line.
    
        CMFCToolBar::SetUserImages(&m_UserImages);
    

另一个示例如下:

CMainFrame::CMainFrame()

theApp.m_nAppLook = theApp.GetInt(_T("ApplicationLook"), ID_VIEW_APPLOOK_VS_2008);//call-stack points to this line.

我发现所有其他分配数字都指向将字符串作为参数直接传递给函数的行。我的问题是:这真的是内存泄漏吗?如果是,那么如何避免这种情况;也许初始化一个 CString 变量并将其作为该函数的参数传递?

【问题讨论】:

可以分享有问题的地方的代码吗? 它在 Load 函数内部泄漏? 一些问题代码: 1> theApp.m_nAppLook = theApp.GetInt(_T("ApplicationLook"), ID_VIEW_APPLOOK_VS_2008); 2> m_UserImages.Load(_T(".\\UserImages.bmp")); @billz:我不确定是否是内存泄漏。分配编号上的断点指向此代码。 请在您的问题中更新您的代码:) 据我所知没有CWinApp::GetInt。您能否向我们展示 that 函数的实现? “分配编号上的断点”是什么意思? 【参考方案1】:

回答您的标题 - 不需要释放字符串文字。

至于将其传递给函数 - 这取决于函数对它的作用。

例如,无论您传递给它什么,此函数都会造成内存泄漏:

void foo(const char* s) 
    strdup(s); // Memory leak!


foo("abc"); // There's a memory leak because foo just created a copy using strdup which it didn't free!

【讨论】:

以上是关于可以直接将字符串作为参数传递会导致 C++ 中的内存泄漏吗?的主要内容,如果未能解决你的问题,请参考以下文章

将字符串 (const char*) 从 C++ 传递到 C# 时,SWIG_csharp_string_callback 会导致内存泄漏

将输入变量从PowerShell表单传递到cmdlet参数会导致空白数据

C++ 数组与字符串⁽²³⁾|函数与数组

将带有参数的 c# 回调方法传递给 c++ dll 会导致 System.ExecutionEngineException

当我们使用winapis将字符串作为参数传递时,如何将c#字符串转换为c++字符串

C++ 错误 - 将 'const Dataset<double>' 作为 'this' 参数传递会丢弃限定符 [-fpermissive]