我正在尝试编译代码审查上发布的以下线程池程序来测试它.
https://codereview.stackexchange.com/questions/55100/platform-independant-thread-pool-v4
但我得到了错误
threadpool.hpp: In member function ‘std::future<decltype (task((forward<Args>)(args)...))> threadpool::enqueue_task(Func&&, Args&& ...)’:
threadpool.hpp:94:28: error: ‘make_unique’ was not declared in this scope
auto package_ptr = make_unique<task_package_impl<R, decltype(bound_task)>> (std::move(bound_task), std::move(promise));
^
threadpool.hpp:94:81: error: expected primary-expression before ‘>’ token
auto package_ptr = make_unique<task_package_impl<R, decltype(bound_task)>>(std::move(bound_task), std::move(promise));
^
main.cpp: In function ‘int main()’:
main.cpp:9:17: error: ‘make_unique’ is not a member of ‘std’
auto ptr1 = std::make_unique<unsigned>();
^
main.cpp:9:34: error: expected primary-expression before ‘unsigned’
auto ptr1 = std::make_unique<unsigned>();
^
main.cpp:14:17: error: ‘make_unique’ is not a member …Run Code Online (Sandbox Code Playgroud) 可能重复:
make_unique和完美转发
为什么C++ 11有make_shared模板,但不是make_unique模板?
这使得代码非常不一致.
auto x = make_shared<string>("abc");
auto y = unique_ptr<string>(new string("abc"));
Run Code Online (Sandbox Code Playgroud) 据我所知,我应该在析构函数中销毁我创建的所有内容new并关闭打开的文件流和其他流.但是,我对C++中的其他对象有些怀疑:
std::vector和std::strings:它们会自动销毁吗?
如果我有类似的东西
std::vector<myClass*>
Run Code Online (Sandbox Code Playgroud)
指向类的指针.调用向量析构函数时会发生什么?
它会自动调用析构函数myClass吗?或者只有矢量被破坏,但它包含的所有对象仍然存在于内存中?
如果我有一个指向类中另一个类的指针会发生什么,比如说:
class A {
ClassB* B;
}
Run Code Online (Sandbox Code Playgroud)
并且在代码中的某个点销毁A类.B类是否会被销毁,或者只是指针和B类仍将存在于内存的某个地方?
关于new和delete的用法,以及Stroustrup的建议......
他说的是(但不完全是,这来自我的书中的笔记):
根据经验,
new属于构造函数和类似操作的delete属于析构函数.此外,new通常用于资源句柄的参数.否则,请避免使用new和delete,而是使用资源句柄(智能指针).
我想知道更有经验的C++ 11用户是否真的应用了这个.
我对此的印象是,哇这似乎是一个非常酷的规则.但是,就任何一般规则而言,我都怀疑.在一天结束时,您将最终使用new并在必要时删除.但也许这个规则是一个我不知道的好准则.
我使用的协议基本上是TCP上的请求和响应协议,类似于其他基于行的协议(SMTP,HTTP等).
该协议有大约130种不同的请求方法(例如登录,用户添加,用户更新,日志获取,文件信息,文件信息......).所有这些方法都没有很好地映射到HTTP(GET,POST,PUT,...)中使用的广泛方法.这种广泛的方法会引入一些实际含义的后续曲折.
但协议方法可以按类型分组(例如用户管理,文件管理,会话管理......).
当前服务器端实现使用class Workerwith方法ReadRequest()(读取请求,由方法加参数列表组成),HandleRequest()(见下文)和WriteResponse()(写入响应代码和实际响应数据).
HandleRequest() 将为实际请求方法调用一个函数 - 使用方法名称的哈希映射到成员函数指向实际处理程序的指针.
实际的处理程序是一个普通的成员函数,每个协议方法有一个:每个都验证它的输入参数,做它必须做的事情并设置响应代码(成功是/否)和响应数据.
示例代码:
class Worker {
typedef bool (Worker::*CommandHandler)();
typedef std::map<UTF8String,CommandHandler> CommandHandlerMap;
// handlers will be initialized once
// e.g. m_CommandHandlers["login"] = &Worker::Handle_LOGIN;
static CommandHandlerMap m_CommandHandlers;
bool HandleRequest() {
CommandHandlerMap::const_iterator ihandler;
if( (ihandler=m_CommandHandlers.find(m_CurRequest.instruction)) != m_CommandHandler.end() ) {
// call actual handler
return (this->*(ihandler->second))();
}
// error case:
m_CurResponse.success = false;
m_CurResponse.info = "unknown or invalid instruction";
return true;
}
//...
bool Handle_LOGIN() {
const …Run Code Online (Sandbox Code Playgroud) 在使用std::unique_ptr自定义删除器时,我希望使用std::make_unique而不是原始的新删除器.我正在使用VC++ 2013.在我看来,std::unique_ptr如果您使用自定义删除器,则无法使用.我错过了什么,或者这是真的吗?
附加信息:
我正在使用a std::unique_ptr<HANDLE, custom_deleter>来保存打开的COM端口的Windows HANDLE.
我可以为此编写一个自定义RAII类,它不会非常困难,但我看到它的使用难度/难度/难度std::unique_ptr.
我的编译器不支持make_unique.怎么写一个?
template< class T, class... Args > unique_ptr<T> make_unique( Args&&... args );
Run Code Online (Sandbox Code Playgroud) Herb Sutter提出了一个简单的实现make_unique():http://herbsutter.com/gotw/_102/
这里是:
template<typename T, typename ...Args>
std::unique_ptr<T> make_unique( Args&& ...args )
{
return std::unique_ptr<T>( new T( std::forward<Args>(args)... ) );
}
Run Code Online (Sandbox Code Playgroud)
我的问题是可变参数模板还不是VS2012的一部分,所以我不能按原样使用这个代码.
有没有一种可维护的方法在VS2012中写这个不会涉及使用不同的args计数复制粘贴相同的函数?
作为这篇文章的后续内容,我想知道如何make_unique通过分配函数临时缓冲区数组来实现它的播放,如下面的代码所示.
f()
{
auto buf = new int[n]; // temporary buffer
// use buf ...
delete [] buf;
}
Run Code Online (Sandbox Code Playgroud)
可这与一些调用所替换,以make_unique与将[]的删除-version被继续使用?
在C++中,我的方法应该返回一个对象或指向对象的指针吗?怎么决定?如果是运营商怎么办?我该如何定义?
还有一件事 - 如果指针变成矢量,我怎样才能在返回后找出它的大小?如果这是不可能的,我认为它应该如何在没有这个限制的情况下正确返回数组?
c++ ×10
c++11 ×7
unique-ptr ×4
c++14 ×3
arrays ×1
destructor ×1
object ×1
pointers ×1
raii ×1
return-value ×1
templates ×1