2017-11-21 3 views
-2

イムベクターに私は、スカラーdelete演算子ここクラッシュ::ベクトル

に関連する何かでアクセス違反を取得し、何らかの理由で新しく作成されたオブジェクトのポインタをプッシュバックしようとしていますクラッシュが起きている場所:

Exception thrown at 0x0F9366CB (ucrtbased.dll) in Battleship.exe: 0xC0000005: Access violation reading location 0xCDCDCDBD. 

クラッシュが発生したファイル:

// 
// delete_scalar.cpp 
// 
//  Copyright (c) Microsoft Corporation. All rights reserved. 
// 
// Defines the scalar operator delete. 
// 
#include <crtdbg.h> 
#include <malloc.h> 
#include <vcruntime_new.h> 



void __CRTDECL operator delete(void* const block) noexcept 
{ 
    #ifdef _DEBUG 
    _free_dbg(block, _UNKNOWN_BLOCK); // *****Crashes here***** 
    #else 
    free(block); 
    #endif 
} 

これは私がメモリを割り当てる方法を示します。

NetSocket* newSocket_ptr = new NetSocket(); 
m_sockets.emplace_back(newSocket_ptr); 
+4

画像を投稿しないでください。 – PaulMcKenzie

+0

@PaulMcKenzieなぜ私はしないのですか? –

+2

画像の郵便番号です。これらのリンクはいつでも死んでしまう可能性があるため、この問題はリンク先の誰にとっても無益です。第二に、私たちが自分ですべてを入力しない限り、そうしたい場合は問題を複製することは不可能です。第3に、答えを出すときに、コードを入力して答えをコピーして貼り付けるのではなく、エラーを表示する必要があります。ところで、あなたの答えは 'malloc'です。なぜあなたは 'malloc'を使っていますか? 'NetSocket'オブジェクトを作成していません。 – PaulMcKenzie

答えて

1

mallocは、オブジェクト自体を構成することはありません。 mallocの代わりにnewを使用してください。私は、あなたの代わりに

NetSocket *newSocket_ptr = (NetSocket*)malloc(sizeof(NetSocket)); 
+0

私は変更を行いましたが、それでも同じことをします –

1

は、オブジェクトを作成するためにmallocを使用しないでください。 1つの問題は、NetSocketクラスにユーザー定義のコンストラクタがあることです。したがって、NetSocketオブジェクトには構築が必要です。

malloc関数は、C++オブジェクトと構造について何も知らない。したがって無効なNetSocketオブジェクトをベクターに配置して、実際にそのような形式のものを使用しようとした場合に問題を引き起こします。NetSocket

new NetSocket以上を使用する必要があります。スマートポインタのコンテナが必要です。

1

NetSocket *newSocket_ptr = new NetSocket(); 

を書くべきだと思う