我试图将新创建的对象的指针推回到向量中但由于某种原因我得到了与标量删除操作符相关的访问冲突
这是发生崩溃的地方:
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);
答案 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
或更好,拥有一个智能指针容器。