小编Ker*_* SB的帖子

抽象类列表

我有抽象类:

public abstract class MyClass
{
    public abstract string nazwa
    {
        get;
    }
}
Run Code Online (Sandbox Code Playgroud)

还有两个继承自MyClass的类:

public class MyClass1 : MyClass
{
    public override string nazwa
    {
        get { return "aaa"; }
    }
}

public class MyClass2 : MyClass
{
    public override string nazwa
    {
        get { return "bbb"; }
    }
}
Run Code Online (Sandbox Code Playgroud)

在另一个类中,我创建了List:

List<MyClass> myList;
Run Code Online (Sandbox Code Playgroud)

现在我想创造

myList = new List<MyClass1>;
Run Code Online (Sandbox Code Playgroud)

编译器显示错误:

Cannot implicitly convert type 'System.Collections.Generic.List<Program.MyClass1>' to 'System.Collections.Generic.List<Program.MyClass>'
Run Code Online (Sandbox Code Playgroud)

我必须有一些简单的方法来转换它...我找不到任何有用的东西

c# list abstract

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

C++:关于内存管理

我对C++有点新,到目前为止一直在用Obj-C和Java编程.

说,我有一节课:

class Person {

private:
   Wife *current_wife;
   //.....
};
Run Code Online (Sandbox Code Playgroud)

所以我需要实现一个setter方法来改变Wife实例变量.

像这样:

Person::SetCurrentWife (Wife *new_wife) {

    current_wife = new_wife;
}
Run Code Online (Sandbox Code Playgroud)

这将是一个副本.

所以从主循环或我调用的东西:

Person *some_person = new Person();
...
Wife *wife = new Wife ();
some_person->SetCurrentWife(wife);
Run Code Online (Sandbox Code Playgroud)

所以我很困惑:这里会有内存泄漏吗?我应该在这里或在Person的析构函数中删除妻子对象吗?在Obj-C中,我会释放当前的妻子,然后向上面的妻子对象发送一条保留消息,但在C++中使用setter方法的正确方法是什么?

c++ memory memory-leaks memory-management

12
推荐指数
2
解决办法
831
查看次数

如何使用PTRACE获得多个线程的一致视图?

当我正在研究这个问题时,我遇到了一个可能的想法ptrace,但是我无法正确理解ptrace与线程的交互方式.

假设我有一个给定的多线程主进程,我想附加到其中的特定线程(可能来自一个分叉的子进程).

  1. 我可以附加到特定的帖子吗?(手册在这个问题上有所不同.)

  2. 如果是这样,这是否意味着单步执行只会逐步完成一个线程的指令?它是否会停止所有进程的线程?

  3. 如果是这样,而我呼吁所有其他线程保持停止PTRACE_SYSCALLPTRACE_SINGLESTEP,或者说所有的线程继续?有没有办法只在一个线程中前进,但保证其他线程保持停止状态?

基本上,我想通过强制所有线程停止来同步原始程序,然后通过单步执行一个跟踪线程来执行一小组单线程指令.

到目前为止,我的个人尝试看起来有点像这样:

pid_t target = syscall(SYS_gettid);   // get the calling thread's ID
pid_t pid = fork();

if (pid > 0)
{
    waitpid(pid, NULL, 0);            // synchronise main process

    important_instruction();
}
else if (pid == 0)
{
    ptrace(target, PTRACE_ATTACH, NULL, NULL);    // does this work?

    // cancel parent's "waitpid" call, e.g. with a signal

    // single-step to execute "important_instruction()" above

   ptrace(target, PTRACE_DETACH, NULL, NULL); …
Run Code Online (Sandbox Code Playgroud)

c linux multithreading ptrace pthreads

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

std :: future作为函数C++的参数

考虑以下代码

void printPromised(std::future<int> f)
{
    std::cout << f.get() << std::endl;
}

int main()
{
    printPromised(std::async(std::launch::async, [](){ return 8; })); // This works

    auto f = std::async(std::launch::async, [](){ return 8; });
    printPromised(f); // This won't work
}
Run Code Online (Sandbox Code Playgroud)

它说"这是一个删除的功能".这是为什么?此外,我需要传递(共享)std::async生成的相同承诺结果; 给多个用户.这意味着当有人调用"getter"时,我需要传递相同的结果(std::async如果已经生成了,我不需要重新生成结果)并且我还需要具有的阻塞机制std::future::get.

c++ c++11 stdasync

12
推荐指数
1
解决办法
4257
查看次数

在可变参数模板中交换两个参数

我正在尝试交换参数包的两个项目.

理想情况下,我想做这样的事情:

template<int i1, int i2, class... Args>
void swapped_copy(some_class a, some_class b, Args... args) {
    a(args...) = b(/* 'args...' where parameters with indices i1 and i2 are swapped */);
}
Run Code Online (Sandbox Code Playgroud)

任何的想法?

非常感谢.

c++ variadic-templates c++11

12
推荐指数
1
解决办法
271
查看次数

是否可以取消Windows中的所有内存?

我有足够的RAM,但是,在启动和完成大量进程后,似乎大多数应用程序的虚拟内存已被分页到磁盘,并且切换到任何较旧的进程需要很长时间才能加载内存回到RAM.

有没有办法,通过Windows API或通过内核调用,让Windows取消所有(或尽可能多)内存?也许通过逐步运行进程列表并让内存管理器取消每个进程的内存?

c windows system

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

GCC的函数__attribute__s是否可以使用虚函数?

GCC C++编译器通过函数属性提供一系列扩展,例如:

int square(int) __attribute__((const));
Run Code Online (Sandbox Code Playgroud)

特别是两个属性,constpure允许您声明函数的评估没有副作用,并且仅依赖于其参数(const),或仅依赖于其参数和全局变量(pure).这允许公共子表达式消除,这可能导致这样的函数被调用的次数少于在代码中写入的次数.

我的问题是这是否可以安全,正确和合理地用于虚拟成员函数:

struct Foo
{
    virtual int square(int) __attribute__((pure));   // does that make sense?
};
Run Code Online (Sandbox Code Playgroud)

这有什么明智的语义吗?它是否允许?还是只是被忽略了?我担心在GCC文档中找不到答案.

这个问题的原因是存在一系列编译器选项-Wsuggest-attribute,这些选项使GCC产生关于可以放置这些属性以改进代码的建议.然而,它似乎最终甚至为虚拟功能提出了这些建议,我想知道是否应该认真对待这些建议.

c++ gcc pure-virtual

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

map move-insertion是否保证元素是否被移动?

C++中的标准"map"容器允许您插入rvalue:

T x;

std::map<int, T> m;

// m[1];  // populate "1"

auto it = m.insert(std::make_pair(1, std::move(x)));
Run Code Online (Sandbox Code Playgroud)

问题是当元素已经存在时会发生什么,即it->second == false.该元素是否x已被"移出"?例如,如果它是一个唯一的指针,将x被重置为null?

在上述情况下,答案似乎是"是",因为移动发生在创建该对时已经发生.但是现在假设我想更新现有值,但仍然保留值是否已经存在的信息(所以我不能说m[1] = std::move(x);).在这种情况下,是否有可能"不要离开"物体?

我在GCC发现了以下工作[更新:作品GCC 4.6,并没有工作在GCC 4.8:

auto it = m.insert(std::pair<const int, T &&>(1, std::move(x)));
Run Code Online (Sandbox Code Playgroud)

但这是否保证不动?

c++ move-semantics c++11

11
推荐指数
1
解决办法
624
查看次数

跨平台的'thread_local'的当前支持状态是什么?

我想要总结一下'thread_local'关键字在不同编译器和平台上的当前支持状态.

我对常见的桌面和移动平台特别感兴趣.我可以找到的信息看起来很不稳定,因为有报道称它在某些平台上工作,而不是在其他平台上工作,或者提到支持是WIP.我们欢迎即使对于单一平台也能确认支持(或缺乏支持)的答案.如果有任何警告,请提供支持的任何警告.

  • Windows(gcc,clang,msvc)
  • Linux(gcc,clang)
  • OS X(gcc,clang)
  • Android(gcc,clang)
  • iOS版
  • 黑莓
  • Windows Phone/RT /等

c++ gcc clang visual-c++ c++11

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

在编译时,`auto`说明符是否较慢?

从C++ 11开始,我们可以使用auto a = 1+2而不是int a = 1+2编译器,并且编译器会a自行推断出类型.它是如何工作的?编译时(更多操作)比自己声明类型更慢吗?

c++ types compile-time auto c++11

11
推荐指数
3
解决办法
2101
查看次数