C++ static 变量的释放时间及文件写入引发的乱序,覆盖问题

一个简单的例子:

#include <iostream>
#include <stdlib.h>
#include <fstream>

using namespace std;
class Log{
private:
    int m_id;
    std::fstream m_f;
public:
    Log(int id, const std::string& filename) :m_id(id){
        cout << "created: " << id << endl;
        m_f.open(filename,std::fstream::out);
    }
    ~Log(){
        cout << "bye: " << m_id << endl;
        m_f.close();
    }
    void log(const string& info){
        cout << info << endl;
        m_f << info;
    }

};
void test(){
    static  Log log(1,"log.log");
    log.log("hello ");
}
void test2(){
    static Log log(2,"log.log");
    log.log("world");
}
int main(){
    {
        test();
        test2();
        cout << "bye main thread" << endl;
    }
    cout << "bye end" << endl;
}

结果

created: 1
hello 
created: 2
world
bye main thread
bye end
bye: 2
bye: 1

从结果中可以看出:

  • static变量log的释放时间问进程结束时,并且按照变量创建时间由晚到早进行释放。
  • 查看log.log 文件,发现内容为"hello ",是因为虽然两个log都打开的相同的文件,m_f.open(filename,std::fstream::out) 返回的是相同的写入位置,写入会覆盖掉。并且由于文件写入是在缓冲区,并没有写入磁盘中。在程序结束清理堆栈时,将缓冲区的内容写入。由于test2()内的log先释放,导致”world“先写入磁盘,然后"hello "。
  • 如果写入时调用m_f.flush();结果为world;
  • 如果将 log变量写到函数外面,才能生成"hello world"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用matio库可以很方便地读取和写入MATLAB格式的mat文件。下面是将两个mat文件的数据部分拼接起来的示例代码: ```c++ #include <matio.h> #include <iostream> #include <vector> int main() { // 读取第一个mat文件 mat_t *mat1 = Mat_Open("file1.mat", MAT_ACC_RDONLY); if (mat1 == nullptr) { std::cerr << "Failed to open file1.mat" << std::endl; return -1; } matvar_t *data1 = Mat_VarRead(mat1, "data"); if (data1 == nullptr) { std::cerr << "Failed to read data from file1.mat" << std::endl; Mat_Close(mat1); return -1; } // 读取第二个mat文件 mat_t *mat2 = Mat_Open("file2.mat", MAT_ACC_RDONLY); if (mat2 == nullptr) { std::cerr << "Failed to open file2.mat" << std::endl; Mat_VarFree(data1); Mat_Close(mat1); return -1; } matvar_t *data2 = Mat_VarRead(mat2, "data"); if (data2 == nullptr) { std::cerr << "Failed to read data from file2.mat" << std::endl; Mat_VarFree(data1); Mat_Close(mat1); Mat_Close(mat2); return -1; } // 检查两个mat文件数据部分的维度是否相同 if (data1->dims[0] != data2->dims[0] || data1->dims[1] != data2->dims[1]) { std::cerr << "The dimensions of data in file1.mat and file2.mat don't match" << std::endl; Mat_VarFree(data1); Mat_VarFree(data2); Mat_Close(mat1); Mat_Close(mat2); return -1; } // 创建新的mat文件写入数据 mat_t *mat = Mat_Create("newfile.mat", nullptr); if (mat == nullptr) { std::cerr << "Failed to create newfile.mat" << std::endl; Mat_VarFree(data1); Mat_VarFree(data2); Mat_Close(mat1); Mat_Close(mat2); return -1; } // 创建新的matvar_t变量并拼接数据 std::vector<size_t> dims = {data1->dims[0], data1->dims[1] + data2->dims[1]}; matvar_t *data = Mat_VarCreate("data", MAT_C_DOUBLE, MAT_T_DOUBLE, dims.size(), dims.data(), nullptr, 0); if (data == nullptr) { std::cerr << "Failed to create data variable in newfile.mat" << std::endl; Mat_VarFree(data1); Mat_VarFree(data2); Mat_Close(mat1); Mat_Close(mat2); Mat_Close(mat); return -1; } double *data_ptr = static_cast<double *>(data->data); double *data1_ptr = static_cast<double *>(data1->data); double *data2_ptr = static_cast<double *>(data2->data); size_t num_elems = data1->dims[0] * data1->dims[1]; for (size_t i = 0; i < num_elems; i++) { data_ptr[i] = data1_ptr[i]; } for (size_t i = 0; i < data1->dims[0]; i++) { for (size_t j = 0; j < data2->dims[1]; j++) { data_ptr[i * dims[1] + data1->dims[1] + j] = data2_ptr[i * data2->dims[1] + j]; } } Mat_VarWrite(mat, data, MAT_COMPRESSION_NONE); Mat_VarFree(data); Mat_VarFree(data1); Mat_VarFree(data2); Mat_Close(mat1); Mat_Close(mat2); Mat_Close(mat); return 0; } ``` 上面的代码首先读取了两个mat文件的数据部分,并检查它们的维度是否相同。然后创建一个新的mat文件,将两个mat文件的数据部分拼接起来,并写入新的mat文件中。注意,这里使用了std::vector<size_t>来保存新的matvar_t变量的维度信息,这样可以简化代码并避免手动管理内存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值