C++でnewした後にrealloc()したポインタをdeleteしても問題ないですか？


表題の通りです。

バッファクラスを作ったのですが、newとreallocの混在に加えて、それをdeleteしています。このようにした場合に解放されない部分が発生したりしないかを確認したいと思っています。

[code]

    char *p = new char[10];
    p  = realloc((void*)p, 15);
    
    delete p[];
    
[/code]

よろしくお願いします。

すいませんdeleteはミスです。修正しました。




`delete`してよいのは`new`で返されたポインタとNULLポインタのみです。  
それ以外のポインタを渡した場合の動作は未定義です。

774RRさんの指摘の通り、このコードだと`realloc`がなくても`new[]`に対して`delete`しているので動作は未定義です。

§ 3.7.4.2 Deallocation functions

> The value of the first argument supplied to a deallocation function may be a
> null pointer value; if so, and if the deallocation function is one supplied
> in the standard library, the call has no effect.  
>  Otherwise, the behavior is undefined if the value supplied to operator
> delete(void*) in the standard library is not one of the values returned by a
> previous invocation of either operator new(std::size_t) or operator
> new(std::size_t, const std::nothrow_t&) in the standard library, and the
> behavior is undefined if the value supplied to operator delete in the
> standard library is not one of the values returned by a previous invocation
> of either operator new or operator new[](std::size_t, const std::nothrow_t&)
> in the standard library.




ダメです。 new [ ] が返してきたポインタを realloc に渡して動作する保証は無いです。  
ISO/IEC 14882:1998 18.4.1.1 operator new の 8  
malloc を呼ぶかどうかは未規定

18.4.1.2 operator new[] の 3  
operator new と同じ

ISO/IEC 9899:1999 7.20.3.4 realloc  
ptr が malloc (snip) によって返されたポインタと一致しないとき、未定義

そういう目的なら単純に std::vector で良いのではないかと。

delete も delete[] でなきゃだめぢゃん。

