C++ program error: malloc(): memory corruption

C++ program error: malloc(): memory corruption

C++新手,一直在写C++程序,但终于在从ctime调用lib函数调用的时候崩溃了。

错误显示如下信息:
malloc(): 内存损坏

据我所知,这个错误(内存损坏)应该是由于对越界内存地址进行操作而导致的。并且打印格式表示YYYY-MM-DD-HH-MM,列为here,说明长度肯定小于100。

附加信息:
- 该程序使用标志编译:“-O3 -g -Wall -Wextra -Werror -std=c++17”
- 编译器:g++ 7.4.0
- 系统:WSL Ubuntu-18

注意:此代码无法编译,也无法重现问题,请参阅下面的更新

/** class file **/
#include <sys/wait.h>
#include <sys/types.h>  
#include <unistd.h>
#include <errno.h>
#include <cstdlib>
#include <iostream>
#include <sstream>
#include <string>
#include <ios>
#include <fcntl.h>
#include <algorithm>
#include <cctype>
#include <ctime>
#include <limits>
#include "cache-proxy.hpp"

static int PROXY_CONFIG = 0;

void get_timestamp(char *buffer, int len);
std::string get_cwd(void);

CacheProxy::CacheProxy(__attribute__((unused)) const std::string& node)
{ 
    curr_dir = fs::get_cwd();
    Logger::get().info("curr_dir " + curr_dir);
    proxy_path = "/usr/sbin/squid";
    std::string squid("squid");

    char buff[200];
    get_timestamp(buff, 200);    // error pops
    std::string proxy_config_path;

    /** plenty of codes following, but commented**/
}

void ~CacheProxy(){}

void get_timestamp(char *buffer, int len)
{
    time_t raw_time;
    struct tm *time_info;
    time(&raw_time);
    time_info = std::localtime(&raw_time);
    std::strftime(buffer, len, "%F-%H-%M", time_info);
    return;
}

// originally from other files, for convenient to be moved into this file 
std::string get_cwd(void)
{
    char path[PATH_MAX];
    std::string retval;
    if (getcwd(path, sizeof(path)) != NULL) {
        retval = std::string(path);
    } else {
        Logger::get().err("current_path", errno);
    }
    return retval;
}


/** header file **/ 
#pragma once
#include <string>

class CacheProxy:
{
private:
    int server_pid;
    std::string proxy_path;
    std::string curr_dir;
    std::string squid_pid_path;
    ;

public:
    CacheProxy(const std::string&);
    ~CacheProxy() override;

};

/** main file **/
int main(){
    Node node(); // the parameter is never used in the CacheProxy constructor though
    CacheProxy proxy(node); // error pops
    proxy.init();
}

感谢您的任何建议或想法。


更新:
代码更新如上,共有三个主要文件。该代码通过省略不相关的代码(我在 运行 进入错误时将它们注释掉)显示了与我的原始代码库完全相同的逻辑序列,但请原谅我给出如此粗略的代码。

基本上是在对象初始化期间弹出错误,我目前假设问题出在 get_cwd 或本地时间。

请指出您是否需要更多信息,尽管我认为其他代码确实不相关。


12 月 21 日更新:
注释掉原代码的不同部分后,我设法找到了错误的部分,但无法修复错误。来自评论的意见确实是内存损坏错误应该起源于事先的某个地方,但是,我要解决这个问题的方法与其他答案有些不同,因为我在我的程序中使用了 setcap 并且在这种情况下不能使用 valgrind .

我使用了另一个名为 ASan(Address Sanitizer) 的工具来进行内存检查。使用该工具非常容易找出内存损坏的来源,并且在 运行 时间发生错误时它具有全面的分析。我在编译器中添加了支持,发现我的主要问题是 CacheProxy class 中字符串变量的内存分配。

到目前为止,它已经证明是另一个问题,即“为什么存在间接内存泄漏源于为字符串对象分配内存时 这个 class 的构造函数被调用”,这个问题我不会在这里崩溃。

但内存问题其实有多种类型和原因,这对我来说真的是一个很好的教训,你不能盯着源代码解决一个不是"index out of bound"或"illegal address access"的问题(段错误)问题。许多工具真的很方便,而且专门用来处理这些事情,所以去拿你的工具吧。

大卫所指的'obvious fixes'是:

#include <iostream>
#include <ctime>
#include <cstdio>

void get_timestamp(char *buffer, int len)
{
time_t raw_time;
struct tm *time_info;
time(&raw_time);
time_info = localtime(&raw_time);                // the line of code that breaks
strftime(buffer, len, "%F-%H-%M", time_info);
return;
}

int main() {
char buff[100];
get_timestamp(buff, 100);
std::cout << std::string(buff);
return 0;
}

malloc 或 free 内的任何崩溃都可能是早期堆损坏的原因。

你的记忆可能早先损坏了。

如果您正在使用 Linux,请在 valgrind 下尝试 运行 您的程序。 Valgrind 可以帮你找出这种错误。