为什么类shared_ptr在其构造函数中有另一个模板?
例如:
template<class T> class shared_ptr {
public:
template<class Y>
explicit shared_ptr(Y * p);
Run Code Online (Sandbox Code Playgroud)
我一直在阅读Scott Meyers的Effective C++,第45项,其中说它背后的想法是通过它们实现多态性; 即,构造shared_ptr<A>从shared_ptr<B>如果B从A衍生
但是没有定义像这样的构造函数
explicit shared_ptr(T * p);
Run Code Online (Sandbox Code Playgroud)
足够?我的意思是,这段代码运行得很好:
class C1 {
};
class C2 : public C1 {
};
template<typename T>
class A
{
public:
A(T &a)
{
var1 = a;
}
T var1;
};
int main(int argc, char *argv[])
{
C2 c2;
A<C1> inst1(c2);
}
Run Code Online (Sandbox Code Playgroud)
那么为什么我们需要另一个构造函数模板呢?
我正在使用docker-compose来管理容器.
当通过docker-compose启动时,如何关闭iptables(为docker设置--iptables = false)?
我对docker的空间使用有问题.我有
在/ var/lib中/泊坞窗/ AUFS /比较/ e20ed0ec78d30267e8cf855c6311b02089b6086ea149c21997a3e6cb9757ecd4的/ tmp /注册表-dev /目录泊坞窗/注册表/ V2 /斑点#杜-SH
4.6G.
我能找到这个文件夹属于哪个容器吗?我有docker注册表运行但在那里我有
/ var/lib/registry/docker/registry/v2/blobs #du -sh
465M.
我怀疑泊坞窗升级(我用的迁移工具https://docs.docker.com/engine/migration/这里)都有可能留下它,或者,我之前建立泊坞窗注册表自己,并移动到预编译注册表左这个.
我可以以某种方式检查它所面对的容器吗?或者,它是否属于任何?
想象一下这样的代码:
string f()
{
string r = "ab";
return r;
}
int main() {
const char *c = f().c_str();
printf("%s.\n", c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这段代码可能会崩溃,对吧?因为c指向的字符串被销毁.但是通过Valgrind运行它并没有显示任何无效的内存访问.为什么?我知道Valgrind无法检查堆栈,但"ab"实际上位于堆上,对吧?
我读到Linux内核线程没有自己的地址空间,它们的mm字段设置为NULL。我知道所有内核线程共享地址空间,但是它们仍然有自己的堆栈,对吧?他们需要以某种方式描述那个领域,如果没有mm,他们该如何做到这一点?以及其他列表(例如打开的文件),它们将其保存在哪里?另外,将 active_mm 字段设置为上一个用户任务的 mm 有什么意义?提前致谢。
我试图调试这个简单的大代码:
\n\n#include "limits.h"\n\nint main()\n{\n long long a = LLONG_MAX;\n\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n如果我像这样运行它
\n\ng++ test.cpp\nRun Code Online (Sandbox Code Playgroud)\n\n我明白了
\n\ntest.cpp: In function \xe2\x80\x98main\xe2\x80\x99:\ntest.cpp:5:17: error: \xe2\x80\x98LLONG_MAX\xe2\x80\x99 undeclared (first use in this function)\nlong long a = LLONG_MAX;\nRun Code Online (Sandbox Code Playgroud)\n\n我检查了这个常量的参考资料,其中写道:
\n\n\n\n\n\n
LLONG_MIN,LLONG_MAX和ULLONG_MAX是为符合 1999 年或更高版本的 C 标准(仅包括 2011 年以来的 C++ 标准:C++11)的库定义的。
所以我尝试设置-std=c++11但没有帮助。有什么建议么?
PS 相同的代码在其他机器上使用 g++ 5.4.0 可以正常编译
\n\n更新: LONG_MAX 可见(但 LLONG_MAX 不可见),机器是 debian4
\n我有一节课:
class A {
public:
string B;
};
Run Code Online (Sandbox Code Playgroud)
然后是一个代码:
A a1;
a1.B = "abc";
printf("%p.\n", a1.B.c_str());
A a2(a1);
printf("%p.\n", a2.B.c_str());
Run Code Online (Sandbox Code Playgroud)
两个实例的c_str引用相同的位置(我理解,复制构造函数逐位复制,字符串在内部将数据存储在char*中,并且指针被复制.
但问题是,为什么这段代码不会崩溃?a1和a2是堆栈变量,当解构它们时,字符串B也将被解构,这些字符串的内部字符*(指向相同的内存位置)是否会被删除两次?是不是双重删除,应该导致崩溃?顺便说一下,我禁用了gcc优化,而valgrind也没有显示任何内容.
我正在尝试通过erlang中的sha256加密字符串,但我无法设法获取字符串.crypto:hash(sha256,somestring)给出了一些二进制文件,我怎么能得到字符串?
我试图反汇编地址 A 处的指令,所以我写
(gdb) x/i 0x00007f8aba6ad96c
0x7f8aba6ad96c <laprintf+167>: nop
Run Code Online (Sandbox Code Playgroud)
但是如何获取它对应于源代码中的哪一行呢?调试符号可用。
我正在运行来自bash的应用程序,就像这样
./app_name var1 var2 $var3
Run Code Online (Sandbox Code Playgroud)
这里var3是--a b, --c d哪里b和d不包含空格.
现在我想添加参数--e f,to $var3,但f包含空格.问题是我试图避免这一行的变化.
./app_name var1 var2 $var3
Run Code Online (Sandbox Code Playgroud)
如果我这样离开它,将app_name两部分理解f为两个不同的参数,因此无法解析.
我可以var3以某种方式改变,以便它不会分裂f成两个不同的args吗?我试过把引号放进去,逃避空间,但没有帮助.
我正在尝试检查签名添加是否会溢出.一般来说,检查是否
int a + int b
Run Code Online (Sandbox Code Playgroud)
会溢出(a和b都是正面的),我检查是否
if (a > INT_MAX - b)
Run Code Online (Sandbox Code Playgroud)
但现在我想检查一下
int a + int b - int c
Run Code Online (Sandbox Code Playgroud)
会溢出来的.我知道a,b和c是正数,b> = c,所以我做了以下检查:
if (a > INT_MAX - b + c)
Run Code Online (Sandbox Code Playgroud)
现在我的问题是,编译器可以重写
INT_MAX - b + c to INT_MAX + c - b ?
Run Code Online (Sandbox Code Playgroud)
我担心的是,它会首先执行INT_MAX + c,这可能会溢出并导致未定义的行为.
c++ ×4
docker ×2
linux ×2
string ×2
bash ×1
c ×1
c++11 ×1
cryptography ×1
disassembly ×1
erlang ×1
filesystems ×1
g++ ×1
gcc ×1
gdb ×1
inheritance ×1
kernel ×1
linux-kernel ×1
memory-leaks ×1
polymorphism ×1
sha256 ×1
shell ×1
std ×1
templates ×1
valgrind ×1
whitespace ×1