我在shared_ptr
和weak_ptr
一起使用时遇到了麻烦enable_shared_from_this
。
当我用Google搜索所见事物的症状时,每个人都建议“ shared_from_this()
当没有shared_ptr
实例拥有您的对象时,您将无法使用。
但这不是我的情况。
考虑以下代码:
#include <memory>
#include <cassert>
class MyClass : std::enable_shared_from_this<MyClass>
{
public:
void this_fails()
{
// Doesn't even assert(), because it throws bad_weak_ptr
assert(shared_from_this());
}
void this_fails_too()
{
std::weak_ptr<MyClass> weak = weak_from_this();
std::shared_ptr<MyClass> strong = weak.lock();
// This assert fails
assert(strong.get());
}
};
int main()
{
std::shared_ptr<MyClass> obj = std::make_shared<MyClass>();
obj->this_fails();
obj->this_fails_too();
}
Run Code Online (Sandbox Code Playgroud)
两种方法都会MyClass
使程序崩溃。我一定缺少明显的东西-这是什么?
c++ shared-ptr weak-ptr private-inheritance enable-shared-from-this
我正在尝试在64位Linux进程中运行32位代码。32位代码是完全独立的,它可以直接进行IA32系统调用。如果要在32位进程中加载此代码,它将运行良好。
最初,我以为我可以为32位代码分配一个堆栈,切换到该堆栈,一切都可以正常运行,但是效果并不理想。主要是因为与堆栈相关的指令(POP / PUSH / ...)正在执行8字节移位而不是4字节移位。
通过谷歌搜索,我了解到可以通过切换到段选择器0x23转换到32位模式。不幸的是,细分是我所知甚少的东西。
我可以使用以下内容(嵌入式AT&T程序集)转换为32位模式:
movl $0x23, 4(%%rsp) // segment selector 0x23
movq %0, %%rax
movl %%eax, (%%rsp) // target 32-bit address to jump to
lret
Run Code Online (Sandbox Code Playgroud)
其中%0包含代码映射位置的32位地址。代码开始运行,我可以看到PUSH / POP现在可以按应有的方式工作,但是它比我在看似无害的指令上以64位模式运行代码时更早崩溃:
0x8fe48201 mov 0xa483c(%rbx),%ecx
Run Code Online (Sandbox Code Playgroud)
在哪里%rbx
(或更像%ebx
因为该代码已经是32位,GDB根本不知道)包含0x8fe48200
。它尝试从(0x8feeca3c
)读取的地址是有效且可读的(根据/proc/XXX/maps
),当我从GDB中读取时,它包含期望值。
但是,Linux会SIGSEGV
根据此指令将a发送到进程,并且错误地址是0
(由strace
或p $_siginfo._sifields._sigfault.si_addr
内部报告gdb
)。在某种程度上,这似乎0x8feeca3c
不是32位域中的有效地址。
任何想法如何进行?
更新:我已经写了一个最小的示例,该段会读取地址0,尽管并未真正引用地址0。尽管堆栈操作可以正常工作,但似乎读取内存中的任何地址都将失败(甚至无法读取刚刚执行的指令的地址!)。
movl $0x23, 4(%%rsp) // segment selector 0x23
movq %0, %%rax
movl %%eax, (%%rsp) // target 32-bit address to …
Run Code Online (Sandbox Code Playgroud) 我正在努力寻找如何在 Oracle 产品中自动扩展 Kubernetes 节点池中的节点数量的方法。这是我在 GKE 或 AKS 上成功使用的东西,只在需要时运行支持 GPU 的节点,这节省了大量成本。
该文档仅揭示了实例池的扩展,这是与 Kubernetes 无关的 Oracle 特定技术。
在 Oracle 的 Kubernetes Container Engine 中是否可以扩展节点池?
assembly ×1
c++ ×1
kubernetes ×1
linux ×1
oracle-cloud-infrastructure ×1
shared-ptr ×1
weak-ptr ×1
x86-64 ×1