今天,我们遇到了一个涉及多线程环境中静态成员函数的问题.我们问自己并且找不到令人满意的答案的问题是:静态成员函数的局部变量是否也是静态的?
// header
class A
{
static int test();
}
// implementation
int A::test()
{
int a = rand();
int b = rand();
int c = a + b;
return c;
}
Run Code Online (Sandbox Code Playgroud)
假设您有两个线程都调用A :: test().当线程1 c = a + b进入线程2时,是否有可能进入test()并a通过分配rand()的新返回值来改变值,换句话说,两个线程是否都运行a,b和c的某些内存位置?
这只是一个快速的问题,可以正确理解当您使用如下构造函数创建类时会发生什么:
class A
{
public:
A() {}
};
Run Code Online (Sandbox Code Playgroud)
我知道没有生成默认构造函数,因为它已经定义,但是由编译器生成的复制和赋值构造函数,或者换句话说,我是否需要声明私有复制构造函数和私有赋值运算符以防止这种情况发生?
class A
{
private:
// needed to prevent automatic generation?
A( const A& );
A& operator=( const A& );
public:
A() {}
};
Run Code Online (Sandbox Code Playgroud) c++ copy-constructor default-constructor assignment-operator
我对我在其中一个较旧的库中遇到的以下代码段有疑问.
try
{
throw "this is an error message";
}
catch( char* error )
{
cout << "an exception occured: " << error << endl;
}
Run Code Online (Sandbox Code Playgroud)
我对这种情况下的行为的理解是,错误消息是按值抛出的,这意味着文本的副本
"这是一条错误消息"
被扔了.catch子句指定一个指向char的指针作为预期的异常类型.有人可以启发我,为什么这个有效?此上下文中的另一个问题涉及为错误消息分配的内存.由于异常类型是指向char*的指针,可以假设错误消息的内存已在堆上动态分配,并且必须由用户删除?
提前致谢
我们在使用类模板时遇到了问题,类模板本身在其某些成员函数中使用了函数对象.VS2010编译器的错误消息是:
错误C2512:'SimpleFunctor :: SimpleFunctor':没有合适的默认构造函数可用
重现的缩小代码如下:
// myfunctor.h
class SimpleFunctor
{
private:
SimpleFunctor( const SimpleFunctor& );
SimpleFunctor& operator=( const SimpleFunctor& );
public:
bool operator()() { return true; }
};
Run Code Online (Sandbox Code Playgroud)
// mytemplate.h
#include "myfunctor.h"
template< typename T >
class Test
{
private:
Test( const Test& );
Test& operator=( const Test& );
public:
Test(){}
void testFunction( T parameter )
{
bool result = SimpleFunctor()();
}
};
Run Code Online (Sandbox Code Playgroud)
// main.cpp
#include "HK_Template.h"
int main()
{
Test< int > obj;
obj.testFunction( 5 );
return 0;
} …Run Code Online (Sandbox Code Playgroud)