Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否存在资源泄漏(Mac OS X)?_C++_Objective C_Macos_Memory Leaks - Fatal编程技术网

C++ 是否存在资源泄漏(Mac OS X)?

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

我试图列举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

尝试在每次返回之前执行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;这样可以防止这种内存泄漏。张贴的代码被简化了。