1

この問題に関してここに多くの投稿をして申し訳ありませんが、私はここで進歩を遂げています。

Cにあるコールバック関数があり、新しいバッファが到着したときに呼び出されます。

私はここで、そのコールバックでは何もしないように、mallocではなく、何もしないように言われました。

次に、新しいバッファを別のクラスに送信します(これにより、サークルバッファが作成され、多くのバッファが保存されます)。

しかし、私が得られない基本的なことは、コールバックから別の関数を呼び出す場合、その関数でそれを行うのと同じです。そのため、DSPを実行し、時間がかかるので、それを実行するのと同じです。そのコールバックで-シリアルであるため。

froof:別のクラスの別の関数にデータを送信していますが、そこでデータを送信しようとすると、もう一度NSLOGこのメモリリークが発生します。

これが私がコールバックから呼び出す他のクラスです:

    - (id)init 
    {
        self = [super init];
        if (self)

        {
            data = malloc (sizeof(SInt16) * 4000);


        }
        return self;
    }

 -(void)sendNewBuffer:(SInt16*)buffer
    {

        data=buffer;

        NSLog(@"data arrived size is : %lu",sizeof(data));
        for(int i=0; i<sizeof(data);i++)
        {
            NSLog(@"%d",data[i]);
        }

    }

の場合にのみ、comment the logメモリリークなしで動作します。これは、コールバックがそれを待っていることを意味します!

そのデータを他の場所で並行して処理するにはどうすればよいですか?私は今そのために一週間を過ごしています。

ありがとう。

4

3 に答える 3

1

NSLogでNSStringなどのObjective-Cオブジェクトを使用する場合のメモリリークの可能性の1つは、それらのオブジェクトが自動解放される(または内部で自動解放されたオブジェクトを使用する)可能性があることです。

コールバックは別のスレッドから呼び出される可能性があります。これを確認するには、コールバックにブレークポイントを設定し、これがメインスレッドかセカンダリスレッドかをデバッガーで確認します。

セカンダリスレッドには、独自のAutoReleaseプールが必要です。システムはメインスレッド用に自動的に作成しますが、セカンダリスレッドを作成する場合は、明示的に作成する必要があります。

また、コールバックでものを割り当てない理由の1つは、通常、パフォーマンスのためです。多くの場合、コールバックを呼び出したスレッドをブロックしないように、コールバックを最小限に抑える必要があります。

于 2012-04-30T16:18:30.323 に答える
1

Cチュートリアルを読むことをお勧めします。コードには少なくとも2つの問題がありますが、実際にはサポートできません。

  • data=buffer;:これは以前の値をリークしますdata。それをデータにコピーするか(memcpy)、または最初にメモリを解放して(free)、次にポインタを保持する必要があります...コールバック後にバッファがスコープ外にならない限り、この場合、唯一のオプションはコピーすることです
  • sizeof(data):これは機能しません。dataポインタです。指し示されているデータの量を知りません

2つ目は、少なくとも詳細情報がないと、コールバックを正しく実装できないことを意味します。(バッファーには、データの量が示されているか、一定のサイズであるかのどちらかです。)

于 2012-04-30T16:24:37.980 に答える
0

推測する必要がある場合(そして私が推測する場合)、コールバックはおそらく割り込みコンテキストで呼び出されるため、mallocなどは致命的となる可能性があります。私がすることは、データをバッファにコピー(つまり、memcpy)し、後で実行するようにコードをスケジュール/信号処理することです(たとえば、条件変数、runloopソースなどを使用して)

于 2012-04-30T16:23:46.423 に答える