小编Jor*_*uez的帖子

保护多个shared_ptr到同一对象的最佳方法

将相同的指针发送到两个不同shared_ptr的指针是不好的,它会导致双重释放,如下所示:

int* p = new int;
std::shared_ptr<int> p1(p);
std::shared_ptr<int> p2(p); // BAD
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式实现相同目的std::enable_shared_from_this:

class Good: public std::enable_shared_from_this<Good>
{
public:
    std::shared_ptr<Good> getptr() {
        return shared_from_this();
    }
};

int main()
{
    std::shared_ptr<Good> gp1(new Good);
    std::shared_ptr<Good> gp2 = gp1->getptr();
}
Run Code Online (Sandbox Code Playgroud)

但这仍然无法防范:

class Good: public std::enable_shared_from_this<Good>
{
public:
    std::shared_ptr<Good> getptr() {
        return shared_from_this();
    }
};

int main()
{
    Good* p = new Good;
    std::shared_ptr<Good> gp3(p);
    std::shared_ptr<Good> gp4(p); // BAD
}
Run Code Online (Sandbox Code Playgroud)

如果您有这样的代码,这可能会成为一个问题:

void Function(std::shared_ptr<Good> p)
{
    std::cout << p.use_count() << '\n'; …
Run Code Online (Sandbox Code Playgroud)

c++ shared-ptr c++11

10
推荐指数
2
解决办法
6002
查看次数

为什么重载解析不选择模板函数的std :: vector重载?

在下面的代码中,如果要通过参数调用它,我希望它使用的std::vector版本,但是它使用的是第一个,并且抱怨不存在。我对模板重载解决方案的理解是,它应该使用“更专业”的版本。我认为这不适用于这里,因为这是函数重载而不是模板重载。但是它甚至没有使用正常的函数重载结果规则,否则会抱怨对的模棱两可。f()std::vectorstd::to_string(const std::vector<T>&)f()

#include <vector>
#include <string>

template<typename T>
std::string f(T&& member) {
    return std::to_string(member);
}

template<typename T>
std::string f(const std::vector<T>& member) {
    return std::to_string(member[0]);
}

int main() {
    int a = 42;
    printf("%s\n", f(a).c_str()); // OK

    std::vector<int> b = { 42 };
    printf("%s\n", f(b).c_str()); // ERROR: to_string doesn't have a std::vector overload

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

c++ templates

5
推荐指数
1
解决办法
75
查看次数

Android NDK:为什么 AAssetManager_open 返回 NULL

我有一些代码:

AAsset* pAsset = AAssetManager_open(pAssetManager, "asset_test.txt", AASSET_MODE_STREAMING);
DebugPrint(pAsset?"pAsset not NULL\n":"pAsset NULL");
if (pAsset)
{
    char buf[1024];
    AAsset_read(pAsset, buf, sizeof(buf));
    DebugPrint(buf);
    AAsset_close(pAsset);
}
Run Code Online (Sandbox Code Playgroud)

此代码始终在 logcat 中打印“pAsset NULL”。

我将 asset_test.txt 文件放入我的 asset 目录中,然后通过将 .apk 重命名为 .zip 并使用 7zip 打开它来查看 .apk 以确保它存在。

我还有一些代码:

AAssetDir* pAssetDir = AAssetManager_openDir(pAssetManager, sDirectory.c_str());

if (!pAssetDir)
{
    DebugPrint("pAssetDir NULL\n");
    return;
}

const char* pszDir;
while ((pszDir = AAssetDir_getNextFileName(pAssetDir)) != NULL)
{
    DebugPrint(pszDir);
}

AAssetDir_close(pAssetDir);
Run Code Online (Sandbox Code Playgroud)

该代码不打印任何内容。换句话说,无论我传入什么路径,在资产目录中都找不到文件。

注意:DebugPrint 只是 __android_log_print() 的一个看起来更漂亮的包装。

android android-ndk

4
推荐指数
1
解决办法
8751
查看次数

标签 统计

c++ ×2

android ×1

android-ndk ×1

c++11 ×1

shared-ptr ×1

templates ×1