我正在尝试在Mac OS上枚举本地用户。 它工作正常,但我认为有 一些资源泄漏。我无法理解。 分析表明没有内存泄漏, 但内存使用量不断增长(记忆报告 XCode的图表)。在我的情况下,从2.7M到4.9M(5 * 1000次迭代)。 任何人都可以说我的代码有什么问题。 是否有任何泄漏或行为是否正常?
这是一个简单的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
答案 0 :(得分:0)
尝试在每个CFRelease
之前执行return
,因为有些迭代没有释放数据。
答案 1 :(得分:0)
我刚刚运行了这个程序,我没有看到任何内存增长。我slightly simplified it是一个单文件C ++程序(目前它是C ++和ObjC ++的混合)。
你确实遇到了内存错误,但我只是希望它在你遇到错误时会导致泄漏。该块泄漏了查询:
if (!CSIdentityQueryExecute(usersQuery, 0, nil))
{
std::cout << "Failed to execute query." << std::endl;
return;
}
你不应该返回这里(技术上不需要),或者你应该在返回前加入CFRelease(usersQuery)
。但同样,如果这是问题,你会看到许多“无法执行查询”的日志消息。