gpt4 book ai didi

c++ - C++ 和共享库中的代码执行点

转载 作者:可可西里 更新时间:2023-11-01 10:41:23 25 4
gpt4 key购买 nike

我和一位同事就使用共享库时的内存分配以及实际执行代码的“位置”进行了有趣的讨论。

提示:我是在明确地寻找笼统的答案。我知道在构建共享库和应用程序时使用完全相同的编译器和设置时,以下几点会起作用。我想假设 DLL 是使用与应用程序完全不同的编译器构建的。

给定以下 struct Foo:

struct Foo
{
int m_FooBar = 1;

const char* GetBar()
{
return m_Bar.c_str();
}

void SetBar(const char* value)
{
m_Bar = value;
}

private:
std::string m_Bar;
};

假设共享库公开了一个函数 Foo* GetFoo() 并且外部应用程序调用它:
1.) 如果外部应用程序调用 foo->SetBar("Hello") 会发生什么?
SetBar 是否会在 DLL 内部执行,从而 m_Bar 的内存分配是安全的,还是内存分配会发生在外部应用程序内部,从而导致问题?
2.) 如果外部应用程序复制返回指针指向的实例会怎样?
从那里警告不要通过 DLL 边界传递 std::string 的许多帖子来看,我认为由潜在的不同 ABI 引起的默认拷贝可能会导致问题。对吗?
3.) 通过在传递的实例上调用 .c_str() 来定义构造 m_Bar 的自定义复制构造函数和赋值运算符是否安全,以便这些方法仅依赖于std::string 的 API 而不是在 ABI 上?

希望一些 C++ 专家能够回答其中的一些问题并阐明这个主题。

最佳答案

1.) What happens if the external application calls foo->SetBar("Hello")? Would SetBar be executed inside the DLL and thus the memory allocation of m_Bar be safe or would the memory allocation happen inside the external application and thus lead to issues?

问题很多,不仅仅是关于内存分配或混淆 C 运行时库。

对于初学者来说,Foo 甚至可能大小不同,std::string 定义可能完全不同,等等等等。

2.) What happens if the external application copies the instance pointed to by the returned pointer? Judging by the many posts out there warning against passing std::string over DLL boundaries I assume that caused by potential different ABIs a default copy could cause problems. Is that correct?

不需要复制就惹上麻烦:因为你对它指向的内存一无所知,即使使用给你的Foo也会破坏一切.

3.) Would it be safe to define custom copy constructors and assignment operators that construct m_Bar by calling .c_str() on the passed instance so that those methods only rely on the API of std::string and not on the ABI?

您尝试达到最低级别的总体想法是好的。但是,尝试使用 m_Bar 不是。

相反,提供一个普通的 C 接口(interface),并可选择在 header 中提供包装类。即便如此,如果您链​​接不同的 C 运行时库(在 Windows 中),请注意分配/取消分配/使用系统资源。

关于c++ - C++ 和共享库中的代码执行点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54448758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com