资源是否泄漏(Mac OS X)?

时间:2014-02-11 10:26:24

标签: c++ objective-c macos memory-leaks

我正在尝试在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

2 个答案:

答案 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)。但同样,如果这是问题,你会看到许多“无法执行查询”的日志消息。