c++ vector访问违反读取位置
c++ vector Access violation reading location
当我试图在函数中推入向量中的元素时,我得到一个访问违反读取位置,但如果我在类构造函数中这样做,它就会起作用。
给出问题的类的头文件
#include <winsock2.h>
#include <string>
#include <vector>
#pragma comment(lib,"ws2_32.lib") //Winsock Library
class Network{
public:
/*
* General functions
*/
Network();
Network(bool debugModus);
~Network();
/*
* Server Functions
*/
int ServerSetup(int port);
void ServerAcceptConnections();
/*
* Server variable
*/
SOCKET m_client;
std::vector<SOCKET> m_clientList;
};
cpp
void Network::ServerAcceptConnections()
{
SOCKET new_socket;
m_clientList.push_back(new_socket);
}
主要void main ()
{
Network network (true);
network.ServerSetup(800);
while(true)
{
network.ServerAcceptConnections();
}
}
如果我执行命令:m_clientList.push_back (new_socket);在类构造函数中它工作,我可以在调试器中看到它,但是当我到达ServerAcceptsConnection()函数时,它不包含任何元素。如果我试图在那里添加一些东西,我会得到这个错误:在server.exe中0x00c730ab的未处理异常:0xC0000005:访问违反读取位置0x01000083.
编辑整个代码标题
#include <winsock2.h>
#include <string>
#include <vector>
#pragma comment(lib,"ws2_32.lib") //Winsock Library
struct Message{
char* message;
unsigned int max_size;
unsigned int size;
};
class Network{
public:
/*
* General functions
*/
Network();
Network(bool debugModus);
int Connect(std::string ipAddress, int port);
int Send(SOCKET socket, char* message, unsigned int size);
Message Receive(SOCKET socket, int size = 2000);
~Network();
/*
* Server Functions
*/
int ServerSetup(int port);
void ServerAcceptConnections();
private:
/*
* General Functions
*/
int Init();
/*
* Server functions
*/
int Bind(int port);
int Listen();
/*
* General Variable
*/
bool m_debugModus;
WSADATA m_wsa;
SOCKET m_s;
struct sockaddr_in m_server;
/*
* Server variable
*/
SOCKET m_client;
std::vector<SOCKET> m_clientList;
std::vector<Message> m_outBuffer;
std::vector<Message> m_inBuffer;
};
the cpp
#include "NetworkClass.h"
#include<stdio.h>
Network::Network()
{
m_debugModus = false;
Init();
}
Network::Network(bool debugModus)
{
m_debugModus = true;
if(m_debugModus) printf("nDEBUG MODUS!!");
if(m_debugModus) printf("nThis mode is for debugging only!!");
if(m_debugModus) printf("n");
if(m_debugModus) printf("n");
Init();
}
int Network::Init()
{
SOCKET new_socket;
m_clientList.push_back(new_socket);
if(m_debugModus) printf("nDEBUG MODUS: Initialising Winsock...");
if (WSAStartup(MAKEWORD(2,2),&m_wsa) != 0)
{
if(m_debugModus) printf("DEBUG MODUS: Failed. Error Code : %d",WSAGetLastError());
return 1;
}
if(m_debugModus) printf(" Initialised.n");
/*
* creating a socket
*
* Settings:
* Address Family : AF_INET (this is IP version 4)
* Type : SOCK_STREAM (this means connection oriented TCP protocol)
* Protocol : 0 [ or IPPROTO_TCP , IPPROTO_UDP ]
*/
if((m_s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET)
{
if(m_debugModus) printf("DEBUG MODUS: Could not create socket : %d" , WSAGetLastError());
}
if(m_debugModus) printf("DEBUG MODUS: Socket created.n");
return 0;
}
int Network::Connect(std::string ipAddress, int port)
{
if(m_debugModus) printf("DEBUG MODUS: Trying to connect with: %s on port %d n", ipAddress.c_str(), port);
m_server.sin_addr.s_addr = inet_addr(ipAddress.c_str());
m_server.sin_family = AF_INET;
m_server.sin_port = htons( port );
if (connect(m_s , (struct sockaddr *)&m_server , sizeof(m_server)) < 0)
{
if(m_debugModus) printf("DEBUG MODUS: Error cant open a connectingn", ipAddress, port);
return 1;
}
if(m_debugModus) printf("DEBUG MODUS: Connectedn");
return 0;
}
int Network::Send(SOCKET socket, char* message, unsigned int size)
{
if( send(socket , message , size , 0) < 0)
{
if(m_debugModus) printf("DEBUG MODUS: Send failed error: %dn", WSAGetLastError());
return 1;
}
if(m_debugModus) printf("DEBUG MODUS: Data Sendn");
return 0;
}
Message Network::Receive(SOCKET socket, int size)
{
Message message;
message.message = (char*) malloc(sizeof(char)*size);
message.max_size = size;
if((message.size = recv(socket , message.message , message.max_size , 0)) == SOCKET_ERROR)
{
if(m_debugModus) printf("DEBUG MODUS: recv failed");
}
if(m_debugModus) printf("DEBUG MODUS: Reply receivedn");
return message;
}
int Network::Bind(int port)
{
m_server.sin_family = AF_INET;
m_server.sin_addr.s_addr = INADDR_ANY;
m_server.sin_port = htons( port );
if( bind(m_s ,(struct sockaddr *)&m_server , sizeof(m_server)) == SOCKET_ERROR)
{
if(m_debugModus) printf("DEBUG MODUS: Bind failed with error code : %dn" , WSAGetLastError());
return 1;
}
if(m_debugModus) printf("DEBUG MODUS: Bind donen");
return 0;
}
int Network::Listen()
{
listen(m_s , 3);
return 0;
}
int Network::ServerSetup(int port)
{
Bind(port);
Listen();
return 0;
}
void Network::ServerAcceptConnections()
{
SOCKET new_socket;
int c = sizeof(struct sockaddr_in);
new_socket = accept(m_s , (struct sockaddr *)&m_client, &c);
if (new_socket != INVALID_SOCKET )
{
if(m_debugModus) printf("DEBUG MODUS: Connection acceptedn");
//Reply to the client
Send(new_socket, "Hello Client , I have received your connection. But I have to go now, byen", strlen("Hello Client , I have received your connection. But I have to go now, byen"));
m_clientList.push_back(new_socket);
}
if (new_socket == INVALID_SOCKET)
{
if(m_debugModus) printf("DEBUG MODUS: accept failed with error code : %d" , WSAGetLastError());
}
}
Network::~Network()
{
closesocket(m_s);
WSACleanup();
}
看起来您超出了vector的容量。在while(true)
循环中,您调用network.ServerAcceptConnections();
函数,该函数在每次调用时构造一个SOCKET
对象,然后将其推入m_clientList
,并且它无限期地执行此操作(因为while
无限期地运行)。至少在查看代码片段时似乎是这样的。
另一方面,类构造函数只被调用一次。
我发现问题了在标题中套接字m_client;越界了如果我把矢量放到这条线上
相关文章:
- 0xC0000005:访问冲突读取位置 0x00000000. 重载 == 运算符的问题
- (此函数用于计算 SMA).在 FA.exe 中0x00509159引发异常: 0xC0000005:访问冲突读取位置0
- 0xC0000005:读取位置0xCDCDCDC1时发生访问冲突
- 0xC0000005:读取位置0xCDCDCDCD时发生访问冲突
- 0x0F50DF58:0xC0000005:访问冲突读取位置0x0047CA04时未处理的异常
- 在 DLL 中嵌入 Python:Py_DECREF列表对象时访问冲突读取位置
- 0xC0000005:访问冲突读取位置0x0000000000000008
- C++访问冲突读取位置0xDDDDDDCD当我尝试删除已更新的数组时
- 使用向量的函数崩溃,调试器说访问冲突读取位置
- OPENCV.3.0错误:0xc0000005:访问违规读取位置0x00000000
- 访问违规读取位置传递指针以在c中写入的DLL中起作用
- vc++ 访问冲突读取位置
- C++ - 智能指针 - 访问冲突读取位置0xDDDDDDDD
- C++访问冲突读取位置错误
- 访问违规读取位置和错误读取字符串的错误
- C 访问违规读取位置0xcccccccccccccccccccc和卡对象
- C++ 访问向量动态数组中的违规读取位置0xFFFFFFFFFFFFFFFF
- 0xC0000005:访问冲突读取位置0x0000000000000000.C++
- CUDA:访问违规读取位置
- OpenGL:glDrawArrays()引发异常(nvoglv32.dll)读取位置0x00000000时发生访问冲突