Cでmalloc/realloc等を使っていた場合でstd::vectorを使わないのは,std::stringとかstd::wstringを使う場合くらいですかね。
文字列に関しては,\0終端の文字列を代入できたりと,std::vectorよりも便利な事があります。
思いっきり元の話を蒸し返すようですが,operator new[/url]でreallocのかわりをすることは無理ですよ。
operator new[/url]の戻り値とnew[/url]の戻り値は異なることがあるので。
次のコードは,VC++ 2005 Professional環境下で異なる戻り値になる例です。
#include <cstdlib>
#include <cstdio>
class foo
{
private:
int val_;
public:
foo (int val = 0) : val_(val)
{
std::printf("%p : foo.ctor\n", reinterpret_cast<void*>(this));
}
~foo ()
{
std::printf("%p : foo.dtor\n", reinterpret_cast<void*>(this));
}
};
void * operator new[/url] (std::size_t size)
{
void * p = std::malloc(size);
std::printf("%p : op.new[/url] (%u)\n", p, static_cast<unsigned>(size));
return p;
}
void operator delete[/url] (void * ptr)
{
std::printf("%p : op.delete[/url]\n", ptr);
std::free(ptr);
}
int main ()
{
foo * p = new foo[1];
std::printf("%p : new[/url] result\n", reinterpret_cast<void *>(p));
delete[/url] p;
return 0;
}
ちなみに,手元での実行結果は,
003A5BE0 : op.new[/url] (8)
003A5BE4 : foo.ctor
003A5BE4 : new[/url] result
003A5BE4 : foo.dtor
003A5BE0 : op.delete[/url]
でした。
# VC++ 2005 Professionalで確認。
VC++ 2005の場合はデストラクタがなければoperator new[/url]の戻り値とnew[/url]の戻り値が一致するようですが。
# つまり,Cの構造体であれば一致するようです。
ただ,operator new/operator new[/url]が確保した領域に何らかの値を書き込んだ場合に,
コンストラクタの実行やnew/new[/url]から制御が返った時点において書き込まれた値が保持され続けている保証について,
標準を軽く読んだ程度では見つけられませんでした。