将对象指针的push_back崩溃到std :: vector中

Crash upon push_back of Object pointer into std::vector

本文关键字:std vector 崩溃 back 指针 对象 push      更新时间:2023-10-16

im试图将新创建的对象的指针推回向量,但是由于某种原因,我得到了访问违规行为,与标量删除operator相关的东西

这是崩溃发生的地方:

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

您仅调用malloc,从不构造对象本身。尝试使用new代替malloc

我想,你应该写

NetSocket *newSocket_ptr = new NetSocket();

而不是

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

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

malloc功能对C 对象和构造一无所知。因此,您将无效的NetSocket对象放入向量中,如果您实际上尝试使用那些不构建的NetSocket对象之一,则会在线路上引起问题。

您需要使用 new NetSocket或更高,有一个智能指针的容器。