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 可以帮你找出这种错误。
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 可以帮你找出这种错误。