它是安全的,就像在的情况下,std::mutex对std::promise<T>被提出mutable,或者它取决于T?如:
using Data = std::tuple<bool, int, int>;
struct X {
std::future<Data> prepare() const {
return m_promise.get_future();
}
void asyncHandler(int a, int b) const {
m_promise.set_value({true, a, b});
}
void cancel() const {
m_promise.set_value({false, 0, 0});
}
mutable std::promise<Data> m_promise; // Is this safe?
};
void performAsyncOp(const X& x) {
std::future<Data> fut = x.prepare();
dispatch(x);
std::future_status result = fut.wait_for(std::chrono::milliseconds(150));
if (result == std::future_status::timeout) {
x.cancel();
}
handleResult(fut.get());
}
Run Code Online (Sandbox Code Playgroud) 以下是安全的吗?第一类成员初始化后不会std::string被发现move吗?打印出来好,但我不确定.
template <typename T>
class Test
{
public:
template <typename... Args>
Test(Args&&... args)
: m_one(new T(std::forward<Args>(args)...)),
m_two(new T(std::forward<Args>(args)...)) // <- Here
{
}
private:
std::unique_ptr<T> m_one;
std::unique_ptr<T> m_two;
};
class C
{
public:
C(int a, int b, const std::string& c)
: m_a(a),
m_b(b),
m_c(c)
{
std::cout << "ctor a=" << m_a << ", b=" << m_b << ", c=" << m_c << "\n";
}
int m_a;
int m_b;
std::string m_c;
};
int main()
{
Test<C> t(1, …Run Code Online (Sandbox Code Playgroud) 我正在尝试跟踪一个非常难以重现的错误.我有一个项目池,并使用以下内容在客户端完成后自动检查池项目:
typedef std::shared_ptr<T> Handle;
Handle MyPool::checkOut()
{
static const auto CheckInDeleter = [this](T* item)
{
this->checkIn(item);
};
return Handle(item, CheckInDeleter);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是这不安全吗?将this被分配到签出项目的第一个池?
我正在将一些Java移植到C++,并且天真地投入使用std::vector.
这是我的问题.我有一个对象存储库,稍后我会要求这个存储库中的对象列表满足某些条件.目前我正在将它们读成临时的std::vector.事实证明,当这个临时超出范围时,delete它的内容当然会导致存储库中的悬空指针.
这是我目前的"解决方法",我觉得特别恶心.
#define NULLIFY(aParam) \
{ \
for (size_t i = 0; i < aParam.size(); i++) { \
aParam[i] = NULL; \
} \
}
typedef std::vector<Object*> TObjectVector;
int main(int argc, char* argv[])
{
PopulateRepository(); // repository uses std::set
TObjectVector subset;
Repository.GetConditionSatisfyingObjects(subset);
DoSomething(subset);
NULLIFY(subset); // Stop destruction of the objects.
}
Run Code Online (Sandbox Code Playgroud)
我对其他想法持开放态度.我最初使用原始指针和动态分配,但我想看看是否有使用STL的加速,因为我有更少的参数传递.该程序是多线程和CPU密集型的.