C++和共享库中的代码执行点
Point of code execution in C++ and shared libraries
我和一位同事就使用共享库时的内存分配以及代码实际执行的"位置"进行了有趣的讨论。
提示:我明确地在寻找一般的答案。我知道,当在构建共享库和应用程序时使用完全相同的编译器和设置时,以下几点会起作用。我想假设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.)如果外部应用程序调用foo->SetBar("Hello")会发生什么?SetBar会在DLL中执行,从而m_Bar的内存分配是安全的吗?还是内存分配会在外部应用程序中发生,从而导致问题?
有很多问题,不仅仅是内存分配或混淆C运行库。
对于初学者来说,Foo
甚至可能不是相同的大小,std::string
的定义可能是完全不同的,等等
2.)如果外部应用程序复制返回指针指向的实例,会发生什么?从许多警告不要在DLL边界上传递std::string的帖子来看,我认为由于潜在的不同ABI,默认副本可能会导致问题。这是正确的吗?
不需要复制就可以遇到麻烦:因为你对它指向的内存一无所知,所以即使使用给你的Foo
也会破坏一切。
3.)通过对传递的实例调用.c_str()来定义构造m_Bar的自定义复制构造函数和赋值运算符,以便这些方法只依赖于std::string的API而不依赖于ABI,这样安全吗?
你尝试达到最低水平的总体想法是好的。然而,尝试玩m_Bar
并不是。
相反,提供一个纯C接口,并可选地在头中提供包装器类。即便如此,如果你链接到不同的C运行库(在Windows中),在分配/释放/使用系统资源时也要小心。
- 以下代码执行哪种内存分配(动态或静态)?
- 允许多个互斥锁所有者或指定数量的并发代码执行
- 使用 execv 从C++代码执行的 Linux 脚本失败
- 由于找不到cpprest_2_10.dll,代码执行无法继续
- 在每次循环迭代时停止代码执行毫秒
- 与Java相比,为什么此C 代码执行速度如此慢
- 记录组件代码执行
- 相同的代码执行两次:性能差异
- 代码执行/CPU 速度每 2 秒减慢一次
- 函数返回本地变量,尽管变量不超出范围,没有编译器问题,并且代码执行
- 如何将字符串从C++DLL返回到MetaTrader 4代码执行生态系统?
- 当我从java代码执行C++时不显示任何输出
- C++和共享库中的代码执行点
- 递归期间代码执行中断
- 为可选的评测代码执行进行高效设计
- 我正在尝试使用 ifstream 将此 C 函数的等效代码执行到 c++ 中
- 最佳C 11测量嵌入式系统代码执行时间的方法
- 如何在iOS应用程序中锁定代码执行
- 中断代码执行
- 是否有一个工具来记录代码执行