资源泄漏与否(Mac OS X)

Resource leak or not (Mac OS X)?

本文关键字:OS Mac 泄漏 资源      更新时间:2023-10-16

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

尝试在每次return之前执行CFRelease,因为某些迭代不会释放数据。

我刚刚运行了这个程序,我没有看到任何内存增长。我稍微简化了它,使其成为一个单文件C++程序(目前它是C++和ObjC ++的混合体)。

确实有内存错误,但我只希望在您遇到错误时导致泄漏。此块泄漏查询:

if (!CSIdentityQueryExecute(usersQuery, 0, nil))
{
  std::cout << "Failed to execute query." << std::endl;
  return;
}

您不应该在这里返回(技术上您不需要),或者您应该在返回之前附上CFRelease(usersQuery)。但同样,如果这是问题所在,您会看到大量"无法执行查询"日志消息。