将相同的指针发送到两个不同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) 在下面的代码中,如果要通过参数调用它,我希望它使用的std::vector
版本,但是它使用的是第一个,并且抱怨不存在。我对模板重载解决方案的理解是,它应该使用“更专业”的版本。我认为这不适用于这里,因为这是函数重载而不是模板重载。但是它甚至没有使用正常的函数重载结果规则,否则会抱怨对的模棱两可。f()
std::vector
std::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)
我究竟做错了什么?
我有一些代码:
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() 的一个看起来更漂亮的包装。