idealvin / coost

A tiny boost library in C++11.
Other
4.01k stars 563 forks source link

coost库本身和std的unique不能同时使用吗 #370

Closed pya789 closed 2 months ago

pya789 commented 2 months ago

和std::unique一起使用时会报错: Program received signal SIGSEGV, Segmentation fault. 0x00000000004aabae in operator[] (i=, this=0x705dc0) at /home/coost/include/co/table.h:33 33 T& operator[](size_t i) {

global::CONFIG = core::loadConfig("/xp/tasks/config.json");
global::SQLITE_DB = core::loadSQLiteDB(global::CONFIG["dir"]["db"].get<std::string>() + "/app.db");

    co::chan<fastring> ch;
    co::go([ch]
           {
        http::Client c("https://www.bilibili.com");
        c.get("/");
        ch << c.body();
        co::print(c.body());
        c.close(); });
    fastring s = "";
    ch >> s;
    co::print("body: ", s);

loadSQLiteDB的实现。改成co内置的unique没有内存报错了,之前使用std::unique_ptr时就会触发上面的报错

co::unique<SQLite::Database> loadSQLiteDB(const std::string &path)
    {
        try
        {
            auto db = co::make_unique<SQLite::Database>(path, SQLite::OPEN_READWRITE | SQLite::OPEN_CREATE);
            spdlog::info("SQLite DB load success: {}", path);
            db->setBusyTimeout(8000);
            return db;
        }
        catch (const std::exception &e)
        {
            spdlog::critical("SQLite DB load failed: {},filepath: {}", e.what(), path);
            exit(1);
        }
    }
pya789 commented 2 months ago

额很奇怪 其他位置使用的std::make_unique没有影响

pya789 commented 2 months ago

额 不知道什么情况 莫名其妙的又好了。。。

idealvin commented 2 months ago

@pya789

std::unique_ptrco::unique 不会冲突。

报错原因应该是:用户代码访问了未初始化的 coost 全局变量。一般只要保证让 coost 内部的全局变量先于用户全局变量初始化,就不会有问题。

用户可以用 co::make_static 创建全局对象:

std::string* s = co::make_static<std::string>(“hello”);
std::string& x = *co::make_static<std::string>(“hello”);

由 coost 接管用户的全局对象,就不会出现上述报错问题。

pya789 commented 2 months ago

@pya789

std::unique_ptrco::unique 不会冲突。

报错原因应该是:用户代码访问了未初始化的 coost 全局变量。一般只要保证让 coost 内部的全局变量先于用户全局变量初始化,就不会有问题。

用户可以用 co::make_static 创建全局对象:

std::string* s = co::make_static<std::string>(“hello”);
std::string& x = *co::make_static<std::string>(“hello”);

由 coost 接管用户的全局对象,就不会出现上述报错问题。

感谢你的指点😊