【问题标题】:Exception in Heap Memory Allocation堆内存分配异常
【发布时间】:2023-04-06 14:06:02
【问题描述】:

我正在使用 Windows 套接字将一些文件上传到 FTP 服务器。我正在搜索具有特定关键字的文件,如果文件名包含该关键字,则将其发送到服务器。代码是这样的:

void FTPUpload(const char* path, const char* name)
{
    SOCKET s1 = ConnectFTP("111.111.111.111", 21);
    Receive(s1);
    Send(s1, "USER user", true);
    Receive(s1);
    Send(s1, "PASS password", true);
    Receive(s1);
    Send(s1,"PWD", true);
    Receive(s1);
    Send(s1,"TYPE I", true);
    Receive(s1);
    Send(s1, "PASV", true);
    char szString[1000];
    Receive(s1, szString);
    char szIP[40];
    char* start = strchr(szString, '(' );
    char* end   = strchr(szString, ')' );
    int num = end - start;
    char str[30] = {'\0'};
    strncpy( str, start + 1, num - 1 );
    char* token = strtok( str , "," );
    strcpy(szIP, "");
    strcat(szIP, token);
    strcat(szIP, ".");
    token = strtok( NULL, "," );
    strcat(szIP, token);
    strcat(szIP, ".");
    token = strtok( NULL, "," );
    strcat(szIP, token);
    strcat(szIP, ".");
    token = strtok( NULL, "," );
    strcat(szIP, token);
    token = strtok( NULL, "," );
    int intA = atoi(token);
    token = strtok( NULL, "," );
    int intB = atoi(token);
    int port = (intA * 256) + intB;
    sprintf(buf, "IP %s, Port %d", szIP, port);

//connect to FTP Server Data Connection
SOCKET s2 = ConnectFTP(szIP, port);
string command = "STOR " + string(name);
Send(s1, &command[0], true);
Receive(s1);

//Send the found file
long Begin;
long End;
char * block;
ifstream myfile;
myfile.open(path, ios::in | ios::binary);
Begin = myfile.tellg();
myfile.seekg(0,ios::end);
End = myfile.tellg();
unsigned long size = End - Begin;
int Div = (int)size / 1024;
int Mod = (int)size % 1024;
for (int i=0; i<Div; i++)
{
    block = new char[1024];
    myfile.seekg(i*1024);
    myfile.get(block,1024+1);
    Send(s2,block, false);
}
if (Mod != 0)
{
    block = new char[Div];
    myfile.seekg(Div*1024);
    myfile.get(block,Mod+1);
    Send(s2,block, false);
}
closesocket(s2);
myfile.close();
Receive(s1);
Send(s1, "QUIT", true);
Receive(s1);
closesocket(s1);
}

void FindFile()
{
    string keyword = "key";
    string path = "C:\\";
    string ipath = path+"*";
    WIN32_FIND_DATA file;
    HANDLE search_handle = FindFirstFile(ipath.c_str(),&file);
    if (search_handle != INVALID_HANDLE_VALUE)
    {
        do
        {
            string cpath = path + file.cFileName;
            DWORD attr = GetFileAttributes(cpath.c_str());
            if ((attr & (0x10)) != (0x10))
            {
                if ((cpath.find(keyword)) != (string::npos))
                    FTPUpload(cpath.c_str(), file.cFileName);
            }
        }
        while(FindNextFile(search_handle,&file));
        FindClose(search_handle);
    }
}

当目录中有2个文件匹配关键字时,程序运行正常。在第三个文件中,我在 dbgheap.c 中收到 bad_alloc 异常,即我在从堆中分配和释放内存时遇到问题。请帮忙。

【问题讨论】:

  • 这里有很多代码。你能指出发生异常的确切行吗?
  • 错误通常发生在FTPUpload()第二次返回时(在发送目录中存在且包含关键字的第二个文件之后)
  • 只是为了清除...FTPUpload() 的主要部分是基于套接字处理、FTP 数据端口协商和读取文件块

标签: c++ sockets memory-management ftp


【解决方案1】:

这是错误的

block = new char[1024];
myfile.seekg(i*1024);
myfile.get(block,1024+1);

块是 1024 字节,但 get 读取 1024 个字符,然后附加一个 '\0' 字符。也许您打算使用read 而不是get

这是错误的

block = new char[Div];
myfile.seekg(Div*1024);
myfile.get(block,Mod+1);

block 是 Div 字节,但你读取的是 Mod 字节。

可能对解决这个问题没有帮助,但请尝试改掉分配数组的习惯。使用std::stringstd::vector 是一种更安全、更容易的选择。例如

myfile.seekg(i*1024);
vector<char> block(1024);
myfile.read(&block[0],block.size());

【讨论】:

  • block 永远不会被删除,导致内存泄漏
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
  • 2011-05-28
  • 1970-01-01
  • 2018-07-24
  • 2015-06-02
  • 1970-01-01
相关资源
最近更新 更多