2012-03-05 5 views
0

私は(UDP上で信頼性の高いレイヤーを実装しようとしている)ネットワーキングフレームワークを持っています。私はパケットオブジェクトへのポインタを受け取るこの受信関数を持っています。次に、ネットワークフレームワークは、パケットを受信するために全負荷を行い、パケットポインタの値をこのパケットに設定します。しかし、これはいくつかの機能が深刻に発生します。だから私は基本的に疑問に思って何が、これは私にとって、この作品のようなものをしない理由、次のとおりです。関数をより深く深く引き渡す

void Main() 
{ 
    int* intPointer = NULL; 
    SomeFunction(intPointer); 
    //intPointer is still null? 
} 
void SomeFunction(int* outInt) 
{ 
    SomeOtherFunction(outInt); 
} 

void SomeOtherFunction(int* outInt) 
{ 
    outInt = new int(5); 
} 

答えて

5

SomeOtherFunctionは値によってポインタを渡され、その割り当てのみれる(非常に基本的な例は、私が何を意味するかをお見せします)渡されたアドレスのコピーをローカルに変更します。

この仕事をするために、参照することによってポインタを渡します。

void Main() 
{ 
    int* intPointer = NULL; 
    SomeFunction(intPointer); 
    //intPointer is still null? 
} 
void SomeFunction(int*& outInt) 
{ 
    SomeOtherFunction(outInt); 
} 

void SomeOtherFunction(int*& outInt) 
{ 
    outInt = new int(5); 
} 

は、戻り値を使用してに問題がある、と言いましたか?

void Main() 
{ 
    int* intPointer = SomeFunction(intPointer); 
    //intPointer is still null? 
} 
int* SomeFunction() 
{ 
    return SomeOtherFunction(); 
} 

int* SomeOtherFunction() 
{ 
    return new int(5); 
} 

[次のコメントを更新してください。 ]

さて、あなたはおそらく、整数が読まれたかどうかを示す、ステータスを示す戻り値を持っている場合、あなたは本当に(あなたの特定のステータスのプレースホルダとしてboolを使用して)されたく、その後何:

void Main() 
{ 
    int intPointer = 0; 
    if (SomeFunction(intPointer) == true) 
    { 
     // read something 
    } 
    else 
    { 
     // failed to read. 
    } 
} 
bool SomeFunction(int& outInt) 
{ 
    return SomeOtherFunction(outInt); 
} 

bool SomeOtherFunction(int& outInt) 
{ 
    outInt = 5; 
    return true; 
} 
+0

戻り値は実際にReceiveStatusのようなものです(ReceiveStatus :: Successfulを返します)。だから私は転送のステータスと同時に受信されたパケットを返すことはできません。とにかくその男のおかげで! – Prodigga

0

SomeOtherFunctionとSomeFunctionへの参照として渡される空のstd :: auto(unique)_ptrを使用する方が良いです。 SomeFunctionが例外を発生させた場合、SomeOtherFunctionに割り当てられたメモリのメモリリークは発生しません。

関連する問題