小编Ben*_*Ben的帖子

为什么添加析构函数会更改此结构的复制构造函数行为?

我有一些代码让我感到困惑.特别是,当我尝试将某些内容添加到列表作为初始化列表时 - 它一直有效,直到我添加析构函数 - 然后它开始尝试查找复制构造函数.

这似乎并不是完全一致的行为.拿这个最小的例子:

#include <list>
int main()
{
    class MemberType
    {
    public:
        MemberType()  {}
        MemberType(MemberType&& copy) { }
    };
    struct ListItemType
    {
        MemberType x;
        ~ListItemType() {}
    };
    std::list<ListItemType> myList;
    myList.push_back({MemberType()});
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这无法在GCC和VS2015中编译,因为push_back尝试访问ListItemType复制构造函数:

main()::ListItemType::ListItemType(const main()::ListItemType&)
Run Code Online (Sandbox Code Playgroud)

(根据我的理解).这似乎是有道理的,因为列表push_back将复制(因为没有移动构造函数),除非这不是行为,如果您删除析构函数.注释掉析构函数,编译按预期成功.

也就是说,即使使用析构函数,以下工作也很好 - 不需要复制或移动构造函数来满足它.这对我来说似乎是一样的行为.

ListItemType foo = { MemberType() };
Run Code Online (Sandbox Code Playgroud)

最后,如果删除或注释掉移动构造函数MemberType- 编译再次成功 - 意味着以下将编译.

#include <list>
int main()
{
    class MemberType
    {
    public:
        MemberType()  {}
    };
    struct ListItemType
    { …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

19
推荐指数
1
解决办法
1110
查看次数

连续检查队列<T>

我想要一个函数在一个线程上连续检查队列是否有新的添加

显然,可以选择连续循环播放睡眠,但我希望减少浪费.

我考虑了某种类型的等待句柄,然后让队列发出信号,但我无法安全地覆盖Enqueue,因为它不是虚拟的.

现在我正在考虑封装一个Queue<T>作为我最好的选择,但我想问你好人,如果有更好的人!

我的想法是:我希望许多线程访问套接字连接,同时保证他们只读取其消息的响应,所以我将有一个线程调度和读取响应,然后用响应数据执行回调(以纯文本格式)

.net c# multithreading thread-safety

13
推荐指数
1
解决办法
4158
查看次数

LoadLibrary采用LPCTSTR

我想使用LoadLibrary开发一个插件系统.
我的问题是:我希望我的功能需要一个const char*并且LoadLibrary需要一个LPCTSTR.
我有一个聪明的主意(LPCSTR)path,不断给我一个模块未找到错误.

目前的代码如下.如果我取消注释该widepath = L..行,它可以正常工作.我已经阅读了使用MFC的解决方案,但我不想使用MFC.

当前代码:

bool PluginLoader::Load(char *path)
{
    path = "Release\\ExamplePlugin.dll";
    LPCTSTR widepath = (LPCTSTR)path;
    //widepath = L"Release\\ExamplePlugin.dll";

    HMODULE handle = LoadLibrary(widepath);
    if (handle == 0)
    {
        printf("Path: %s\n",widepath );
        printf("Error code: %d\n", GetLastError());

        return false;
    }

    int (*load_callback)() = (int (*)()) GetProcAddress(handle, "_plugin_start@0");

    if (load_callback == 0)
    {
        return false;
    }

    return load_callback() == LOAD_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

c++ windows dll loadlibrary

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

内核模块Init和Exit函数的调用顺序错误

我正在创建一个非常简单的hello world内核模块并获得一些疯狂的行为.这一直有效,直到我升级到内核3.3.8,现在它......好吧,它init在退出时调用函数,并exit在初始化时调用函数.我确保我的名字是正确的

// Needed for module definitions
#include <linux/module.h>
// Needed for initilization modules
#include <linux/init.h>

// Must declare some license
MODULE_LICENSE("Dual BSD/GPL");

// Function to be called on insmod
// Returns 0 on success
static int __init mymod_init(void)
{
        // Prints kernel alert.  Check /var/log/syslog
        printk(KERN_ALERT "Module was loaded, this is the printk.");

        return 0;
}

// Function to be called on rmmod
static void __exit mymod_exit(void)
{
        // Prints kernel alert.  Check /var/log/syslog
        printk(KERN_ALERT …
Run Code Online (Sandbox Code Playgroud)

c linux kernel module kernel-module

9
推荐指数
1
解决办法
5412
查看次数

JQueryUI在一个id上调用.accordion两次

我正在尝试使用AJAX根据框中选择的内容动态生成JquerUI手风琴.目前我有

 <div style="display:none" id="testselect">
 </div>
Run Code Online (Sandbox Code Playgroud)

用JS

$("#courseselect").change(function () {
                $("#testselect").html(""); // Empty any previous data
                $("#testselect").css("display", "block"); // Display it if it was hidden
                $.getJSON('json.php?show=tests&courseid=' + $(this).val(), function(data) { 
                for(x in data)
                {
                    $("#testselect").append("<h3 value=\"" + data[x].uno + "\"><a href=\"#\">" + data[x].name + "</a></h3>");
                    $("#testselect").append("<div>Foo</div>");
                }
                $("#testselect").accordion({ change:function(event, ui) {  courseid = ui.newHeader.attr("value");
                 } });
            });
      });
Run Code Online (Sandbox Code Playgroud)

现在,这是我第一次更改选择时的工作,但之后它将恢复为普通的未格式化的HTML.好像从未完成对.accordion()的调用.我猜这与JQuery有关,不希望我格式化两次,但我真的不知道.

javascript jquery jquery-ui

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

C Unix管道示例

试图实现一个shell,主要是管道.我已经编写了这个测试用例,我希望将其简单地传递给wc ......它肯定不能按预期工作.它将ls打印到终端然后打印耗尽的内存.我很失落如何解决这个问题并让它发挥作用.find_path适用于我的所有测试.

编辑 - 我必须使用execv为项目,它是一个类的东西,但我已经尝试使用execvp以防万一,它完全相同的事情.这也只是一个例子,一个测试,看看为什么它不起作用,我为fork和waitpid调用fork两次,因为我没有别的事可做.

#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
int find_path(char* execname, char** dst)
{        
        char *path = getenv("PATH");
        path = strdup(path);
        char *pos;
        path = strtok_r(path, ":", &pos);
        char *originalpath  = path;
        do
        {
                char* test = (char*)calloc(strlen(path) + strlen(execname) + 2, sizeof(char));
                test = strcpy(test, path);
                int testlen = strlen(test);
                (*(test+testlen)) = '/';
                strcpy(test + testlen + 1,execname);
                struct stat buf;
                int result = stat(test, &buf);
                if (result == 0) …
Run Code Online (Sandbox Code Playgroud)

c unix fork pipe

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

C++中的Google协议缓冲区:从现有结构创建消息

我正在考虑将Google 协议缓冲区作为我使用命名管道在C++和C#之间进行通信问题的解决方案.但我有一个问题:我在protobuf上找到的是如何使用protobuf编译器从原型创建消息.这很整洁,但我还需要能够序列化现有的结构.我似乎无法找到任何信息(但也许我忽略了它).您是否知道是否可以使用protobufs在C++中序列化结构,因此可以在.NET中读取它,而无需修改现有的结构?

c++ protocol-buffers

3
推荐指数
1
解决办法
1651
查看次数

提示输入CreateFile的凭据

我想设计一个检查文件中某些文本的函数。它采用文件路径,并且该路径可以是UNC路径,例如\ path \ to \ file \ share。

它还将使用当前用户的凭据。我想做的是能够提示用户输入要使用的新凭据。用伪代码

hCreds = NULL;
if (!fAutoLogon) { hCreds = PromptForCredentials(); }

hFile = CreateFile( pszFile, GENERIC_READ, FILE_SHARE_READ ,
                    NULL, OPEN_EXISTING,
                    FILE_ATTRIBUTE_NORMAL, NULL , hCreds);
Run Code Online (Sandbox Code Playgroud)

c++ windows winapi

3
推荐指数
1
解决办法
489
查看次数

来自Win32的Cortana

这是一个相当无方向的帖子,我担心我道歉.我试图弄清楚如何从win32(非通用)应用程序中使用Cortana.我找到了这个链接,但我无法分辨是否有办法从非托管代码访问这些API.这让我走上了一条兔子小道,想知道这个UniversalApiContract的东西是什么,以及如何使用它形成本机代码,但到目前为止,我的空洞非常空洞.

有人可以请我指点方向!! 我甚至需要搜索什么来开始学习如何本地访问这些API?我应该在Windows运行时读取一些内容吗?

在此先感谢,我再次为一般性问题道歉 - 不知道还有什么地方可以转.

c++ windows native windows-runtime

3
推荐指数
1
解决办法
1160
查看次数

基本方案递归

我有这样一个文件:

    declare
    a = aexpress 
    b = bexpress 
    begin 
Run Code Online (Sandbox Code Playgroud)

我的方案程序将当前输入端口设置为此文件,然后调用 (declarations (read)) 我回来的内容,是#f.或者说控制台说"对象#f不适用".

我已经完成了我的括号使用,并且无法找到任何理由它应该返回一个布尔值,但我确定我错过了一些东西.

我想要的是((a aexpress)(b bexpress))

(define declarations
  (lambda (token)
    (cond (((eq? token 'begin) '())
           (else (let* ((name token)
                        (eqsign (read))
                        (value (read)))
                   (cons (list name value) (declarations (read)))))))))
Run Code Online (Sandbox Code Playgroud)

被称为:

    (define convert
      (lambda (filename)

         (begin
           (set-current-input-port! (open-input-file filename))
           (statement (read))
           )

        )
      )
 (define statement (lambda (token) (

                                   cond (
                                     ( (eq? token 'declare) (declarations (read)) )
                                        ;       ( (eq? token 'declare) (declare_statement)  )
                                        ;       ( (eq? …
Run Code Online (Sandbox Code Playgroud)

lisp recursion scheme

0
推荐指数
1
解决办法
719
查看次数