在我的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变量并将其作为该函数的参数传递?
答案 0 :(得分:0)
回答你的标题 - 不需要释放字符串文字。
至于将它传递给函数 - 它取决于函数对它的作用。
例如,无论传递给它的是什么,此函数都会产生内存泄漏:
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!