gpt4 book ai didi

c++ - 内存仅在 gcc 上意外更改?

转载 作者:太空宇宙 更新时间:2023-11-04 16:12:35 25 4
gpt4 key购买 nike

在下面的代码中,char* d 的内存地址在 100 毫秒后发生了变化,我没有做任何改变。有人可以解释以下代码中哪里是未定义的行为吗?

此行为仅在 gcc 4.8.2 上可见,在 visual studio 2012 上不可见。

#include <iostream>
#include <string>
#include <boost/thread.hpp>
#include <chrono>

using namespace std;

class state_p
{
public:
unsigned char* state;

void init(unsigned char* state_in)
{
state = state_in;
}
};

void state_link(unsigned char* &state)
{
for(unsigned int i = 0; i < 10; i++)
{
state_p s;
s.init(state+184*i);
}
}

void go_sleep(unsigned int ms)
{
boost::this_thread::sleep(boost::posix_time::milliseconds(ms));
}

class main_class
{
private:
char *d;
unsigned s;
char* a;

void core()
{
while(true)
{
cout << "A_CORE: " << (void*)d << "\n";
}
}

public:
main_class() {}

main_class(char *di)
{
d = di;
boost::thread start_core_thread(&main_class::core, this);
}
};

void show(unsigned int &i)
{
cout << i;
go_sleep(100000000);
}

int main()
{
unsigned char *state = (unsigned char*)calloc(3072, sizeof(char));

char st = 100;
main_class main_c;
main_c = main_class(&st);

state_link(state);

go_sleep(100);
unsigned int i = 0;
show(i);
}

输出:

A_CORE: 0x186a0
A_CORE: 0x186a0
A_CORE: 0x186a0
A_CORE: 0x186a0
A_CORE: 0x186a0
A_CORE: 0x186a0
A_CORE: 0x186a0
A_CORE: 0x186a0
A_CORE: 0
A_CORE: 0
A_CORE: 0
A_CORE: 0

最佳答案

这里:

main_c = main_class(&st);

您创建并销毁了一个临时的 main_class,将其复制到 main_c。这里:

boost::thread start_core_thread(&main_class::core, this);

您将指向该临时对象的指针绑定(bind)到线程。线程在它被销毁后继续访问它,给出未定义的行为。特别是,如果临时存储被另一个对象重用,您很可能会看到值发生变化。

如果要直接初始化非临时对象:

main_class main_c(&st);

那么您应该回到明确定义的行为领域。您可以考虑使类不可复制,以防止出现此错误。

您还应该显式分离线程,或将其作为类成员保留以供稍后加入。在不加入或分离线程对象的情况下销毁线程对象在 Boost 中已被弃用,并且在标准库中被禁止。

关于c++ - 内存仅在 gcc 上意外更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26729846/

25 4 0
文章推荐: css - 将一个