将Object指针的push_back撞到std :: vector时崩溃

时间:2017-11-21 17:15:17

标签: c++ memory std

我试图将新创建的对象的指针推回到向量中但由于某种原因我得到了与标量删除操作符相关的访问冲突

这是发生崩溃的地方:

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);

3 个答案:

答案 0 :(得分:1)

您只是在调用malloc,从不构建对象本身。尝试使用new代替malloc

答案 1 :(得分:1)

我想,你应该写

NetSocket *newSocket_ptr = new NetSocket();

而不是

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

答案 2 :(得分:1)

不要使用malloc来创建对象。一个问题是您的NetSocket类具有用户定义的构造函数,因此您的NetSocket对象需要构造。

malloc函数对C ++对象和构造一无所知。因此,您将无效的NetSocket对象放入向量中,如果您实际尝试使用其中一个格式错误的NetSocket对象,则会导致问题。

你需要使用new NetSocket或更好,拥有一个智能指针容器。