仅在使用某一特定函数时才会损坏堆上的内存

问题描述 投票:0回答:1

我正在创建一个应用程序,该应用程序将内容从 url 下载到文件中,并且在获取 url 的子字符串用于创建下载名称时遇到了一个大问题。在过去的 4 小时里,我花了 4 个小时进行研究、观看视频、询问人工智能等等,但我就是无法弄清楚这一点。我的问题是,当我在堆上分配内存来存储从我自己的函数获得的 url 的最后一个子字符串时,一旦语句完成,该值就会完全损坏为一大堆 f。仅当使用我的这个函数时才会发生这种情况,我认为该函数会导致某种内存损坏,但我无法弄清楚。

在下面您可以看到我正在分配一个最多可容纳 256 个字符的字符,这对于 url 的几乎任何子字符串来说应该绰绰有余,并使用我的 getLastTextUrl 函数声明和初始化它

    char* alloc2 = new char[256];
    const char* AIO = getLastTextUrl("https://habitual.cc/wp-content/uploads/2023/10/RuntimeFiles.zip", alloc2);

我的 getLastTextUrl 函数

const char* getLastTextUrl(const std::string &url, char* &alloc) 
{
    size_t pos = url.find_last_of("/") + 1;
    if (pos != std::string::npos) 
    {
        alloc = (char*)url.c_str() + pos;
        return url.c_str() + pos;
    }
    return url.c_str(); 
}

我已经对其进行了多次调试,该函数工作正常,我相信在

alloc = (char*)url.c_str() + pos;
runs alloc 被正确分配之后(RuntimeFiles.zip),然后我进入两次以完成该函数,它带我回到主函数并且仍然突出显示因为它正在调试
const char* AIO = getLastTextUrl("https://habitual.cc/wp-content/uploads/2023/10/RuntimeFiles.zip", alloc2);
当将鼠标悬停在 alloc2 上时,现在它保存了正确的字符串(RuntimeFiles.zip),但是当我进入下一个语句时,它只是
char* alloc = new char[256];
alloc2 和 AIO 损坏并变成很多 f,就像我提到的那样。

我对 C++ 还很陌生,这是我第一次在堆栈溢出上发帖,如果有一些草率的代码或一些没有意义的东西,我很抱歉,如果有人需要一些澄清,请让我知道同样的建议。

c++ heap-memory heap heap-corruption memory-corruption
1个回答
1
投票

很明显这个

alloc = (char*)url.c_str() + pos; 

应该是这个

strcpy(alloc, url.c_str() + pos); 

当您显然想要复制字符串字符而不是指针时,您的代码复制了一个指针(然后该指针变得无效)。

但真的不要在 C++ 程序中使用 C 字符串。还有更复杂、更脆弱的。这是重写为使用 C++ 字符串的函数

std::string getLastTextUrl(const std::string &url) 
{
    size_t pos = url.find_last_of("/") + 1;
    if (pos) 
    {
        return url.substr(pos);
    }
    return url; 
}

如果在某些时候您需要将返回的字符串传递给需要 C 字符串的 C API,则在调用 C API 时对 C++ 字符串使用

.c_str()
,而不是之前。这本质上是您的代码所犯的设计错误。

© www.soinside.com 2019 - 2024. All rights reserved.