Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 关闭导致分段错误的文本文件,并在C+中的linux下检测到“glibc”+;_C++_Linux_Text_Segmentation Fault_Glibc - Fatal编程技术网

C++ 关闭导致分段错误的文本文件,并在C+中的linux下检测到“glibc”+;

C++ 关闭导致分段错误的文本文件,并在C+中的linux下检测到“glibc”+;,c++,linux,text,segmentation-fault,glibc,C++,Linux,Text,Segmentation Fault,Glibc,我有一个日志类,该类包含一个定义为:of stream logfile的流和一个互斥体,以确保每次只有一个线程写入该文件(该程序是多线程的)。 该类定义为: #define LOG_NAME "log.txt" using namespace std; class Log { private: pthread_mutex_t mutex_write; ofstream logfile; public: Log(); ~Log(); void Writ

我有一个日志类,该类包含一个定义为:
of stream logfile
的流和一个互斥体,以确保每次只有一个线程写入该文件(该程序是多线程的)。 该类定义为:

#define LOG_NAME "log.txt"

using namespace std;

class Log
{
private:
    pthread_mutex_t mutex_write;
    ofstream logfile;

public:
    Log();
    ~Log();
    void Write (string txt);
};
建造商是:

Log::Log()
{
    pthread_mutex_init (&mutex_write,NULL);
    pthread_mutex_lock (&mutex_write);
    logfile.open(LOG_NAME, ios::out | ios::trunc);
    logfile << "Created log file named " << LOG_NAME << endl;
    pthread_mutex_unlock (&mutex_write);
}
Log::~Log()
{
    logfile << "Closing log file" << endl;
    pthread_mutex_lock (&mutex_write);
    logfile.close();
    pthread_mutex_unlock (&mutex_write);
    pthread_mutex_destroy (&mutex_write);
}
这并不是一直都发生,它似乎是随机发生的,大约有10%的时间。该程序是多线程的(在linux下)

编辑: 用法示例:(其中
log
是指向
log
类的对象的指针)


不是100%确定,但它可能与代码中任何地方的内存损坏有关。
要更深入地研究这个问题,请尝试在Valgrind下运行您的程序,或者调查核心转储(确保它已启用-AFAIR ulimit-c unlimited)。

问题在于,我们在检查所有线程是否已完成时遇到问题。我们已经修好了,现在它可以正常工作了。
这个问题可能是因为其他线程试图访问一个关闭的文件,有时还试图访问一个被终止的实体。

这个日志对象在线程中是如何使用的?我想这是一个共享对象。你能给我们提供一些代码来说明Write()调用的外观吗?为什么在析构函数中有锁保护?或者,此时不应该使用Log对象,或者您需要担心更大的问题…@forsvarir,我在析构函数中添加了保护,以防万一,因为我们已经将互斥锁放在了每一个地方。像这样的堆损坏通常是由于
中止
发生的代码之前某个地方的错误造成的。使用ostringstream,而不是stringstream。因为发现了问题-简短的问题。日志是全局静态对象吗?为什么不在项目中使用工作C++日志框架?@谢尔盖:首先,我不知道C++中存在现有的日志记录框架。其次,正如您所看到的,我编写的日志类非常简单,易于编写。我们对它没有bug(除了这一个,它是其他部分线程的bug,而不是日志本身)。我们将不得不投入更多的工作来学习如何使用现有的类,而不是编写这个类。
void Log::Write (string txt)
{
    pthread_mutex_lock (&mutex_write);
    logfile << txt << endl;
    pthread_mutex_unlock (&mutex_write);
}
*** glibc detected *** corrupted double-linked list: 0x0000000000513eb0 ***
Abort
stringstream str;
str.str("");
str << "Ant " << i << " was created at place: (" << x << "," << y << ")";
log->Write (str.str());
log->Write ("Created board entity");