C++ 是否存在资源泄漏(Mac OS X)?
我试图列举Mac os上的本地用户。 它工作正常,但我认为有 一些资源泄漏。我不明白。 分析表明没有内存泄漏, 但是内存使用量在不断增长内存报告 XCode上的图表。在我的例子中,从2.7M到4.9M 5*1000次迭代。 谁能说出我的代码有什么问题吗。 是否有任何泄漏或行为正常C++ 是否存在资源泄漏(Mac OS X)?,c++,objective-c,macos,memory-leaks,C++,Objective C,Macos,Memory Leaks,我试图列举Mac os上的本地用户。 它工作正常,但我认为有 一些资源泄漏。我不明白。 分析表明没有内存泄漏, 但是内存使用量在不断增长内存报告 XCode上的图表。在我的例子中,从2.7M到4.9M 5*1000次迭代。 谁能说出我的代码有什么问题吗。 是否有任何泄漏或行为正常 这是一个简单的C++命令行工具项目 使用带有默认生成设置的Objective-c代码XCode 5: ///////////////////////////////////////////// // main.cpp
这是一个简单的C++命令行工具项目 使用带有默认生成设置的Objective-c代码XCode 5:
/////////////////////////////////////////////
// main.cpp
#include "test.h"
#include <iostream>
#include <thread>
int main(int argc, const char * argv[])
{
//for (int i = 0; i < 1000; ++i)
for (int i = 0; i < 5; ++i)
{
std::cout << "Iteration # " << i << std::endl;
for (int j = 0; j < 1000; ++j)
{
Execute();
}
std::this_thread::sleep_for(std::chrono::seconds(1));
}
return 0;
}
/////////////////////////////////////////////
// test.mm
#import <Collaboration/Collaboration.h>
#import <CoreServices/CoreServices.h>
#import <Foundation/Foundation.h>
#import <SystemConfiguration/SCDynamicStore.h>
#import <SystemConfiguration/SCDynamicStoreCopySpecific.h>
#include <iostream>
void Execute()
{
CSIdentityAuthorityRef identityAuthority = CSGetLocalIdentityAuthority();
if (!identityAuthority)
{
std::cout << "Failed to get identity authority." << std::endl;
return;
}
CSIdentityQueryRef usersQuery(CSIdentityQueryCreate(nil, kCSIdentityClassUser, identityAuthority));
if (!usersQuery)
{
std::cout << "Failed to create query." << std::endl;
return;
}
/////////////////////////////////////////////////
// Without CSIdentityQueryExecute(usersQuery, 0, nil) - everething is ok.
/////////////////////////////////////////////////
if (!CSIdentityQueryExecute(usersQuery, 0, nil))
{
std::cout << "Failed to execute query." << std::endl;
return;
}
CFRelease(usersQuery);
}
#ifndef __MY_TEST_H__
#define __MY_TEST_H__
void Execute();
#endif
尝试在每次返回之前执行CFRelease,因为有些迭代没有释放数据。我刚刚运行了这个程序,没有看到任何内存增长。我想成为一个单一的文件C++程序,目前它是C++和Objc++的混合。 你确实有一个内存错误,但我只希望它会导致泄漏,如果你得到错误。此块泄漏查询:
if (!CSIdentityQueryExecute(usersQuery, 0, nil))
{
std::cout << "Failed to execute query." << std::endl;
return;
}
您不应该在这里返回您在技术上不需要的内容,或者您应该在返回之前包含一个cfreleaseursquery。但是,同样,如果这是问题所在,您会看到许多无法执行查询日志消息。是否可能是您没有发布CSIdentityAuthorityRef?或者,您可以尝试在每次返回之前执行CFRelease。我不知道,这只是一个idea@DaniBarcaCasafont不,是的,我将把它作为一个答案发布。苹果的代码偶尔也会泄漏。因此,泄漏的内存可能无法修复。由于每次迭代1kB,这只是一个小漏洞,在现实世界的例子中,这应该并不重要。您不必不断地创建帐户列表。你应该释放用户;返回之前,因为无法执行查询。虽然但是除非你的代码出错5000次,否则这不是问题。删除。稍后再回答。谢谢。但问题仍然存在。在实际代码中,我使用std::unique_ptr typedef std::unique_ptr csidentityqueryuiqueptr;CSIdentityQueryUniquePtr usersQueryCSIdentityQueryCreatenil,kCSIdentityClassUser,identityAuthority;这样可以防止这种内存泄漏。张贴的代码被简化了。