是否有一个很好的简单的方法,以取代所有出现"/"在std::string与"\/"逃脱的所有斜线std::string?
我意识到在调用vector.clear()哪个持有共享指针之后,shared_ptr没有释放拥有的对象的析构函数.
代码示例如下所示.即使vector.clear()被调用,在共享指针之后调用的析构函数超出了范围.我的问题是 - 我是否必须通过重置它们来手动删除向量内的所有智能指针?有没有更简单的方法可以提供建议?
Output :
constructor
I am here
destructor
Code:
#include <vector>
#include <iostream>
#include <memory>
using namespace std;
class A
{
public:
A(){cout << "constructor" << endl;};
~A(){cout << "destructor" << endl;};
};
int main( )
{
shared_ptr<A> sharedptr (new A);
std::vector<shared_ptr<A> > test;
test.push_back(sharedptr);
test.clear();
cout << "I am here" << endl;
}
Run Code Online (Sandbox Code Playgroud) 我有一个模式,重复几个成员函数,如下所示:
int myClass::abstract_one(int sig1)
{
try {
return _original->abstract_one(sig1);
} catch (std::exception& err) {
handleException(err);
} catch (...) {
handleException();
}
}
bool myClass::abstract_two(int sig2)
{
try {
return _original->abstract_two(sig2);
} catch (std::exception& err) {
handleException(err);
} catch (...) {
handleException();
}
}
[...]
int myClass::abstract_n(bool sig3a, short sig3b)
{
try {
return _original->abstract_n(sig3a, sig3b);
} catch (std::exception& err) {
handleException(err);
} catch (...) {
handleException();
}
}
Run Code Online (Sandbox Code Playgroud)
其中抽象一个到n是纯虚拟抽象接口用于其的方法myClass和_original是具体实现.
我不喜欢这个模式在代码中重复,并希望找到一种方法来消除重复try/ catch模式和代码作为单个抽象,但我想不出一个在没有宏的情况下在C++中执行此操作的好方法.我认为有一种方法可以让模板更好地完成这项工作.
请建议一种简洁的方法来重构此代码以抽象出重复的模式.
在一次采访中询问了这个问题.第一部分是编写单例类:
class Singleton
{
static Singleton *singletonInstance;
Singleton() {}
public:
static Singleton* getSingletonInstance()
{
if(singletonInstance == null)
{
singletonInstance = new Singleton();
}
return singletonInstance;
}
};
Run Code Online (Sandbox Code Playgroud)
然后我被问到如何getSingletonInstance()在多线程情况下处理这个问题.我不太确定,但我修改为:
class Singleton
{
static Singleton *singletonInstance;
Singleton() {}
static mutex m_;
public:
static Singleton* getSingletonInstance()
{
m_pend();
if(singletonInstance == null)
{
singletonInstance = new Singleton();
}
return singletonInstance;
}
static void releaseSingleton()
{
m_post();
}
};
Run Code Online (Sandbox Code Playgroud)
然后有人告诉我,虽然需要一个互斥锁,但挂起和发布互斥锁效率不高,因为需要时间.并且有一种更好的方法来应对这种情况.
有没有人知道在多线程情况下处理单例类的更好,更有效的方法?
是否可以在用户空间和内核空间之间共享信号量(或任何其他同步锁)?命名的POSIX信号量具有内核持久性,这就是为什么我想知道是否有可能从内核上下文创建和/或访问它们.
由于有关正常使用POSIX信号量的大量信息,搜索互联网并没有多大帮助.
我正在为实时系统开发一个统一的界面,我在其中添加了一些书籍,由信号量保护.这些书籍保留是在资源分配和解除分配上完成的,这是在非实时环境中完成的.
使用RTAI,等待和发布信号量的线程需要处于实时上下文中.这意味着使用RTAI的命名信号量意味着在用户空间中的每个等待/发布之间切换实时和非实时上下文,更糟糕的是,为内核空间中的每个sem/wait创建一个短实时线程.
我正在寻找的是一种在内核和用户空间之间共享正常Linux或POSIX信号量的方法,这样我就可以安全地在非实时环境中等待/发布它.
任何有关此主题的信息将不胜感激.如果这是不可能的,你还有其他任何想法如何完成这项任务?1
1一种方法是添加系统调用,在内核空间中具有信号量,并让用户空间进程调用该系统调用,并且信号量将全部在内核空间中进行管理.如果我不是因为这个而不必修补内核,我会更高兴.
我有以下基类和子类:
class Event(object):
def __init__(self, sr1=None, foobar=None):
self.sr1 = sr1
self.foobar = foobar
self.state = STATE_NON_EVENT
# Event class wrappers to provide syntatic sugar
class TypeTwoEvent(Event):
def __init__(self, level=None):
self.sr1 = level
self.state = STATE_EVENT_TWO
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我正在检查TypeTwoEvent类的实例,检查我知道在基类中存在的字段 - 我希望它默认值为None.但是,我的代码引发了以下异常:
AttributeError:'TypeTwoEvent'对象没有属性'foobar'
我的印象是基类字段将由子类继承,并且创建子类的实例将实例化基类(从而调用其构造函数)...
我在这里失踪了什么?为什么TypeTwoEvent没有一个None属性-当其所来源的基本类有一个TypeTwoEvent属性?
我有一个使用 C++ 语言的情况,在那里我得到了从 1 到 7 的整数值,用于输入到工作日的方法中。因为我可以很容易地将枚举类类型static_cast转换为整数,但从整数转换为枚举是一个问题。引发的问题 - 是否可以将数字转换为枚举类类型?因为在另一种生成整数的方法中,必须调用 enum 类基于工作日输入的方法进行工作日更新。该更新方法仅采用 enum 类类型,即 enum class weekday { Monday =1, 。. 星期日 }
方法是void updateWeekday(weekday e)。
有人可以帮忙吗?
可能重复:
g ++未定义的typeinfo引用
未定义的符号"vtable for ..."和"typeinfo for ..."?
我不能用我的班级.
class Accel {
public:
virtual void initialize(void);
virtual void measure(void);
virtual void calibrate(void);
virtual const int getFlightData(byte);
};
class Accel_ad : public Accel {
public:
Accel_ad() : Accel(){}
void initialize(void) {/*code code code...*/}
void measure(void) {/*measure code*/}
const int getFlightData(byte axis){/*getting data*/}
void calibrate(void) {
int findZero[FINDZERO];
int dataAddress;
uint8_t data[2];
for (byte calAxis = XAXIS; calAxis < ZAXIS; calAxis++) {
if (calAxis == YAXIS) dataAddress = 0x32;
if (calAxis == …Run Code Online (Sandbox Code Playgroud) 由于某些原因,我似乎无法将我的展示位置新工作.基于这个问题,我已经正确设置了这个问题.
但是,我继续得到错误:
'operator new':函数不带2个参数
这是我的代码:
char * p = new char [sizeof(Node) * 5];
Node* node = new(p) Node();
Run Code Online (Sandbox Code Playgroud)
其中Node是链表节点.我试图根据其他堆栈溢出问题简化此问题,我仍然得到相同的错误:
char *buf = new char[sizeof(int)]; // pre-allocated buffer
int *p = new (buf) int;
Run Code Online (Sandbox Code Playgroud)
有谁知道我为什么会遇到这个问题?
任何帮助是极大的赞赏!
PS,这个有效:
Node* node = new Node();
Run Code Online (Sandbox Code Playgroud)