Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;向量/类/线程_C++_Multithreading_Class_Vector - Fatal编程技术网

C++ C++;向量/类/线程

C++ C++;向量/类/线程,c++,multithreading,class,vector,C++,Multithreading,Class,Vector,我使用的是Win7/VS2008(9)SDK 6/7.1 我在使用的代码中遇到了一个问题 代码的迷你版如下所示 class CONNECTION { int/std::string/bool vars; // just to make it simple CONNECTION ( int defaultvar ); CONNECTION ( const CONNECTION& copycon ) ~CONNECTION ( ); DWORD sta

我使用的是Win7/VS2008(9)SDK 6/7.1

我在使用的代码中遇到了一个问题
代码的迷你版如下所示

class CONNECTION
{
    int/std::string/bool vars; // just to make it simple
    CONNECTION ( int defaultvar );
    CONNECTION ( const CONNECTION& copycon )
    ~CONNECTION ( );
    DWORD static WINAPI staticstart( void *param )  //HACK to use createthread on classes
    { return ((CONNECTION *)param)->main); } // yea it works fine
    DWORD main();
};
此类没有带有副本和析构函数的默认构造函数 所有变量都被很好地复制,析构函数不会留下任何memleaks,构造函数很简单,只需将参数分配给一个变量。。所有变量和代码都被省略,以使其变得简单,因为它们不是问题所在

class main
{
    std::vector<CONNECTION> con;
    int addcon( int defaultvarofcon )
    {
        CONNECTION temp( defaultvar );
        con.push_back( temp );
        return con.size() - 1;
    }
}
程序运行良好,无错误关闭
但是当我添加额外的代码时,比如

main mymainclass;
mymainclass.addcon( 0 );
mymainclass.addcon( 1 );
mymainclass.addcon( 2 );
程序因访问冲突而崩溃 在检查代码两次之后,我在所有线程上一步一步地调试它,我发现只有在向量处使用一个元素,主线程才能读取主线程和工作线程中所有向量类/元素的正确值

但是,如果我像第二个代码一样使用多个元素,那么它们自己线程中所有元素上的所有数据都是不可访问的(错误指针)。但在主线程上,它们仍然正确并且显示正确的值


有人能帮我找出这个代码的错误吗

如果需要自定义析构函数和复制构造函数,还需要自定义赋值运算符


否则,您很快就会得到几个类实例引用相同的内部指针/…,很容易导致内存损坏和访问冲突。

std::vector
不是线程安全的。因此,您必须使用某种互斥来确保一次只有一个线程访问它

否则,如果任何线程调整向量的大小,该向量可能必须分配新存储、复制元素,然后释放旧存储。。。显然,在其他线程使用旧存储时释放旧存储是一件非常糟糕的事情


您需要自己分配
连接
对象。让
std::vector
管理它们意味着当向量调整大小时,它们将在内存中四处移动,而其他线程持有的指针将悬空。调整向量的大小会使指向其任何内容的所有指针失效。

与任何仅供参考的方法一样,因为您的类有一个复制构造函数和析构函数,它几乎肯定会有一个赋值运算符。目前还不清楚这是否与您的问题有关,但这肯定是一个等待发生的错误。不,不是。也许会发生,但现在不是问题:/i我已经检查过了。没有跨线程访问任何变量。线程之间没有共享变量,尽管我忘了,而且我不是在谈论共享变量。如果你看到上面的代码,你会看到我在谈论实例的变量。它不被任何其他线程共享或访问。@VirusEcks:等等,您是否正在创建新线程?看起来您正在将一个指向
连接
实例的指针传递给
staticstart
,但是内存会被释放(当
std::vector
调整大小时),因此当
staticstart
尝试通过该指针调用实例方法时,你的程序崩溃了。@ben Voigt:当调整向量大小时,内存会被释放吗?我不知道。但是在主线程中,我可以看到正确的数据。所以记忆不是freed@VIrusEcks:在主线程中,您可以看到正确的数据,因为在释放旧内存之前,内容已复制到新地址。但现在它是一个新地址。。。您在其他线程中使用的所有指针仍保留旧地址,该地址已不存在。
main mymainclass;
mymainclass.addcon( 0 );
mymainclass.addcon( 1 );
mymainclass.addcon( 2 );