Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.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++代码中调用ObjtoEc对象_C++_Ios_Exc Bad Access_Audioqueueservices - Fatal编程技术网

防止从C++代码中调用ObjtoEc对象

防止从C++代码中调用ObjtoEc对象,c++,ios,exc-bad-access,audioqueueservices,C++,Ios,Exc Bad Access,Audioqueueservices,以下是我的情况: 我正在使用音频队列服务来录制声音。当在缓冲区已满时调用回调函数时,我会将缓冲区内容发送到objective-C对象以对其进行处理 void AQRecorder::MyInputBufferHandler(void * inUserData, AudioQueueRef inAQ,

以下是我的情况:

我正在使用音频队列服务来录制声音。当在缓冲区已满时调用回调函数时,我会将缓冲区内容发送到objective-C对象以对其进行处理

void AQRecorder::MyInputBufferHandler(void *                                inUserData,
                                      AudioQueueRef                         inAQ,
                                      AudioQueueBufferRef                   inBuffer,
                                      const AudioTimeStamp *                inStartTime,
                                      UInt32                                inNumPackets,
                                      const AudioStreamPacketDescription*   inPacketDesc)
{
    AQRecorder *aqr = (AQRecorder *)inUserData;
    try {
        if (inNumPackets > 0) {
            NSLog(@"Callback ! Sending buffer content ...");
            aqr->objectiveC_Call([NSData dataWithBytes:inBuffer->mAudioData length:inBuffer->mAudioDataBytesCapacity]);
            aqr->mRecordPacket += inNumPackets;
        }

        if (aqr->IsRunning())
            XThrowIfError(AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL), "AudioQueueEnqueueBuffer failed");
    } catch (CAXException e) {
        char buf[256];
        fprintf(stderr, "Error: %s (%s)\n", e.mOperation, e.FormatError(buf));
    }
}

void AQRecorder::objectiveC_Call(NSData *buffer) {
    MyObjCObject *myObj = [[MyObjCObject alloc] init];
    [myObj process:buffer];
}
这里的问题是,在我的处理过程中,我从myObj的处理方法中获得了一个EXC_BAD_访问,经过一些研究,我猜这与myObj被释放有关

进程从缓冲区内容执行for循环,即使我只对缓冲区值执行NSLog,也会得到EXC_BAD_访问错误

-(void)run:(NSData *)bufferReceived {
   NSUInteger bufferSize = [bufferReceived length];
   self.buffer = (short *)malloc(bufferSize);
   memcpy(self.buffer, [bufferReceived bytes], bufferSize);

   for(int i= 0; i < bufferSize; i++) {
      NSLog("value: %i", buffer[i]);
   }

}  
你能告诉我怎么做吗

ps:我的文件的扩展名是.mm,整个项目都启用了ARC,我的代码的其余部分似乎可以正常工作


谢谢

将缓冲区malloc并强制转换为“short*”,然后使用“bufferSize”字节数枚举缓冲区。这意味着“for”循环最终将尝试读取超过缓冲区的末尾,这可能导致“EXE\u BAD\u ACCESS”。这是因为每次迭代都是以一个“短”而不是一个“字节”前进的。您应该将循环更改为以下内容:

for(int i= 0; i < bufferSize / sizeof(short); i++) {
    NSLog("value: %i", buffer[i]);
}

要么这样做,要么更改“buffer”成员变量的类型。

我不确定您为什么认为“myObj”会被释放,因为您没有调用“autorelease”。我的“objective c”有点生疏,但您显示的代码更像是内存泄漏。也许你可以展示“MyObjCObject.process”的内部结构。@Karmasbone刚刚添加了一些细节。如果你不正确使用NSLog,你将获得EXC\u BAD\u访问权限。我们需要了解MyObjCObject进程的内部结构:现在,据我所知,这行qr->Objective\u调用[NSData dataWithBytes:inBuffer->mAudioData length:inBuffer->mAudioDataBytesCapacity];正在创建一个自动删除的NSData对象,该对象将在当前运行循环后解除锁定,除非您专门将其保留在某个位置。谢谢@Karmasbone!EXC\u坏访问问题已修复。