小编byt*_*uff的帖子

为什么ctime()返回的字符串包含换行符?

为什么返回的字符串ctime()有一个换行符(0x0A)作为最终字符?例如,这段代码:

#include <iostream>
#include <cstdlib>

int main(int argc, char* argv[])
{
    time_t now;
    time(&now);
    char* time_str = ctime(&now);
    std::cout << time_str << "why is this on a new line?" << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

...产生以下输出:

$ ./time.exe
Wed Oct 23 14:52:29 2013
why is this on a new line?
$ 
Run Code Online (Sandbox Code Playgroud)

没什么大不了的; 我可以从字符串中删除最后一个字节,但为什么ctime()要把它放在首位呢?

c c++ string time std

50
推荐指数
2
解决办法
5198
查看次数

Boost :: asio - 如何中断被阻塞的tcp服务器线程?

我正在研究一个多线程应用程序,其中一个线程充当从客户端接收命令的tcp服务器.该线程使用Boost套接字和acceptor等待客户端连接,从客户端接收命令,将命令传递给应用程序的其余部分,然后再次等待.这是代码:

void ServerThreadFunc()
{
    using boost::asio::ip::tcp;
    boost::asio::io_service io_service;
    tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), port_no));

    for (;;)
    {
        //  listen for command connection
        tcp::socket socket(io_service);
        acceptor.accept(socket);

        //  connected; receive command
        boost::array<char,256> msg_buf;
        socket.receive(boost::asio::buffer(msg_buf));

        //  do something with received bytes here
    }
}
Run Code Online (Sandbox Code Playgroud)

这个线程大部分时间都在调用时被阻塞acceptor.accept().此时,线程仅在应用程序退出时终止.不幸的是,这会在main()返回后导致崩溃 - 我相信因为线程在单例被销毁后尝试访问应用程序的日志单例.(当我到这里时,就像那个,诚实的guv.)

当应用程序退出时,如何干净地关闭此线程?我已经读过可以通过从另一个线程关闭套接字来中断原始套接字上的阻塞accept()调用,但这似乎不适用于Boost套接字.我已经尝试使用Boost异步tcp echo服务器示例将服务器逻辑转换为异步i/o ,但这似乎只是为阻塞调用交换acceptor::accept()阻塞调用io_service::run(),所以我留下了同样的问题:一个阻塞打电话我不能打断.有任何想法吗?

c++ sockets multithreading boost boost-asio

26
推荐指数
1
解决办法
1万
查看次数

在类的析构函数中关闭类的线程成员是一个好主意吗?

当该类的对象被销毁时,关闭由C++类管理的Boost线程的最佳方法是什么?我有一个类,它在构造时创建并启动一个线程,并提供一个公共Wake()方法,当它需要做一些工作时唤醒线程.该Wake()方法使用Boost互斥锁和Boost条件变量来表示线程; 线程程序等待条件变量,然后完成工作并返回等待.

目前,我在类的析构函数中关闭了这个线程,使用布尔成员变量作为"运行"标志; 我清除该标志,然后在条件变量上调用notify_one().然后线程程序唤醒,注意"running"为false,并返回.这是代码:

class Worker
{
public:
    Worker();
    ~Worker();
    void Wake();
private:
    Worker(Worker const& rhs);             // prevent copying
    Worker& operator=(Worker const& rhs);  // prevent assignment
    void ThreadProc();
    bool m_Running;
    boost::mutex               m_Mutex;
    boost::condition_variable  m_Condition;
    boost::scoped_ptr<boost::thread> m_pThread;
};

Worker::Worker()
    : m_Running(true)
    , m_Mutex()
    , m_Condition()
    , m_pThread()
{
    m_pThread.reset(new boost::thread(boost::bind(&Worker::ThreadProc, this)));
}

Worker::~Worker()
{
    m_Running = false;
    m_Condition.notify_one();
    m_pThread->join();
}

void Worker::Wake()
{
    boost::lock_guard<boost::mutex> lock(m_Mutex);
    m_Condition.notify_one();
}

void Worker::ThreadProc()
{
    for (;;)
    {
        boost::unique_lock<boost::mutex> lock(m_Mutex);
        m_Condition.wait(lock);
        if …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading boost destructor

18
推荐指数
1
解决办法
9682
查看次数

为什么智能指针不能在构造函数中为我调用new()?

是否有可能编写一个智能指针,在其构造函数中分配对象本身 - 而不是开发人员必须调用new?换句话说,而不是写:

std::unique_ptr<myClass> my_ptr(new myClass(arg1, arg2))

......可以写:

std::smarter_ptr<myClass> my_ptr(arg1, arg2)

语言语法能够表达这个吗?这会是可取的吗?可怕?我正在考虑防止这个错误(我当然是自己做的):

myFunction(std::unique_ptr<myClass>(new myClass()), std::unique_ptr<myClass>(new myClass()))

...如果第二次分配发生在第一个对象被安全地隐藏在其智能指针之前,那么首先分配哪个对象可能会泄漏.但更智能的指针实际上会使这个安全吗?

c++ memory-management smart-pointers

11
推荐指数
2
解决办法
411
查看次数

如何在第三方库代码中处理exit()调用?

我正在开发一个C++应用程序,它使用另一个团队用C编写的库.库的编写者喜欢exit()在发生错误时调用,这会立即结束程序,而不会在C++应用程序中调用堆栈上对象的析构函数.应用程序设置了一些系统资源,这些资源在进程结束后不会被操作系统自动回收(共享内存区域,进程间互斥等),因此这是一个问题.

我有应用程序和库的完整源代码,但是库已经非常完善,并且没有单元测试,因此更改它将是一个大问题.有没有办法"挂钩"调用,exit()以便我可以为我的应用程序实现正常关闭?

我正在考虑的一种可能性是创建一个大类,应用程序 - 意味着所有清理都会在其析构函数或其成员之一的析构函数中发生 - 然后在堆中分配其中一个大对象main(),设置全局指向它的指针,并atexit()用于注册一个只通过全局指针删除对象的处理程序.那可能有用吗?

有没有一种已知的好方法来解决这个问题?

c++ legacy-code

11
推荐指数
2
解决办法
4039
查看次数

发送自己的物体 - 一个好主意?

将数据操作函数移动到包含该数据的类时,在哪里绘制线?例如,假设您有一个简单的类,它存储天气的描述,包括温度,湿度,风速和风向的变量,以及测量的时间.现在假设你有一个这个类的对象,你想把它传送给别人 - 另一个进程,另一台机器,等等.您是否将代码传输到对象本身 - 例如,通过向简单数据类添加Send(目标类型)方法?或者你是否将这种功能保存在可以通过介质发送和接收任何内容的单独类中 - 无论是网络,文件i/o,进程间通信还是类似的东西?

我的直觉是保持我的数据类简单并在我想传输它们时将它们包装起来 - 在序列化它们的类中,并使用他们理解的简单接口呈现发送器和接收器类.另一种方法似乎是将包括厨房水槽在内的所有东西都放入简单的数据类中 - 每个函数都可以对这些数据进行操作,但是间接的.简而言之,网络错误处理代码在我看来并不属于简单的数据类.

这对我来说很明显,但我一直看到开发人员在他们的类上放置Send()方法.他们甚至将消息类告诉Send(),这对我来说似乎非常违反直觉; 如果我在一张纸上写一封信,我不会告诉该报纸.我把信封在一个信封里然后交给邮递员,因为他有一辆面包车和一张地图.人们怎么想?

oop class data-structures

9
推荐指数
3
解决办法
162
查看次数

如果shared_ptr的构造函数失败会发生什么?

如果我理解正确的话,当一个shared_ptr(来自boost,tr1,std,等等)用一个指向新分配对象的指针初始化时,shared_ptr的构造函数会分配少量内存来保存它管理的指针的引用计数.如果分配失败会怎么样?在以下代码中:

class my_class {};
void my_func(shared_ptr<my_class> arg);

int main(int argc, char* argv[])
{
    my_func(shared_ptr<my_class>(new my_class()));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

... my_class如果shared_ptr无法为其引用计数分配内存,那么对象是否会泄露?或者shared_ptr的构造函数是否负责删除对象?

c++ memory-management smart-pointers

8
推荐指数
1
解决办法
1266
查看次数

提交更改后如何恢复从CVS中删除的目录?

使用cvs remove <dir>和删除目录后cvs commit,是否有一种简单的方法来撤消更改 - 恢复工作副本和存储库中的目录?到目前为止,我只能找到一些建议,如果我还没有完成提交,或者它是一个文件而不是一个目录.如果可能,我想保留目录内容的历史记录.

cvs

5
推荐指数
1
解决办法
2329
查看次数

默认赋值运算符是否在所有成员上调用operator =?

同样,默认的复制构造函数是否在所有成员上调用复制构造函数?例如,如果一个类有非POD成员,如下所示:

class A
{
    std::string str;
};
Run Code Online (Sandbox Code Playgroud)

...默认的编译器生成的复制构造函数和赋值运算符是否正常工作?他们会调用字符串的复制构造函数吗?operator=或者它们是否只是成为成员变量的按位副本str

换句话说,拥有一个std::string成员意味着这个类需要一个用户实现的复制构造函数和赋值运算符吗?

c++ class copy-constructor assignment-operator

5
推荐指数
1
解决办法
1448
查看次数

可以将Doxygen配置为从协作图中省略基本C++类型吗?

有一种方法,以防止从的Doxygen包括基本C++类型(int,float等)在其产生的图表?例如,当协作图包含大量用户定义的类型时,知道它们都在int内部使用并不像查看类型之间的关系那样有用,并且从图的所有部分到大量的行都是有用的.inttype使图表在视觉上"忙碌"并且难以阅读.

理想情况下,代码将设计得足够精巧,模块化,协作图会小而简单,并且包含基本类型不会成为问题.但Doxygen确实闪耀的一种情况是,当用户必须尽快处理大量编写错误的代码并尽快开始工作时,最好简化协作图.案件.

我知道MAX_DOT_GRAPH_DEPTH简化可以简化协作图,但这会减少用户定义类型和基本类型的数量.为了充分利用图中可用的空间,我想仅包含用户定义的类型.

c++ documentation doxygen

5
推荐指数
1
解决办法
871
查看次数