小编Lub*_*osD的帖子

shared_ptr和weak_ptr的琐碎情况失败

我在shared_ptrweak_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

32
推荐指数
2
解决办法
1435
查看次数

在Linux上以64位进程运行32位代码-内存访问

我正在尝试在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(由stracep $_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)

linux assembly x86-64

6
推荐指数
1
解决办法
451
查看次数

如何在 Oracle 的 Kubernetes 容器引擎中自动扩展节点池?

我正在努力寻找如何在 Oracle 产品中自动扩展 Kubernetes 节点池中的节点数量的方法。这是我在 GKE 或 AKS 上成功使用的东西,只在需要时运行支持 GPU 的节点,这节省了大量成本。

该文档仅揭示了实例池的扩展,这是与 Kubernetes 无关的 Oracle 特定技术。

在 Oracle 的 Kubernetes Container Engine 中是否可以扩展节点池?

kubernetes oracle-cloud-infrastructure

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