我有抽象类:
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++有点新,到目前为止一直在用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方法的正确方法是什么?
当我正在研究这个问题时,我遇到了一个可能的想法ptrace,但是我无法正确理解ptrace与线程的交互方式.
假设我有一个给定的多线程主进程,我想附加到其中的特定线程(可能来自一个分叉的子进程).
我可以附加到特定的帖子吗?(手册在这个问题上有所不同.)
如果是这样,这是否意味着单步执行只会逐步完成一个线程的指令?它是否会停止所有进程的线程?
如果是这样,而我呼吁所有其他线程保持停止PTRACE_SYSCALL或PTRACE_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) 考虑以下代码
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.
我正在尝试交换参数包的两个项目.
理想情况下,我想做这样的事情:
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)
任何的想法?
非常感谢.
我有足够的RAM,但是,在启动和完成大量进程后,似乎大多数应用程序的虚拟内存已被分页到磁盘,并且切换到任何较旧的进程需要很长时间才能加载内存回到RAM.
有没有办法,通过Windows API或通过内核调用,让Windows取消所有(或尽可能多)内存?也许通过逐步运行进程列表并让内存管理器取消每个进程的内存?
GCC C++编译器通过函数属性提供一系列扩展,例如:
int square(int) __attribute__((const));
Run Code Online (Sandbox Code Playgroud)
特别是两个属性,const并pure允许您声明函数的评估没有副作用,并且仅依赖于其参数(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++中的标准"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)
但这是否保证不动?
我想要总结一下'thread_local'关键字在不同编译器和平台上的当前支持状态.
我对常见的桌面和移动平台特别感兴趣.我可以找到的信息看起来很不稳定,因为有报道称它在某些平台上工作,而不是在其他平台上工作,或者提到支持是WIP.我们欢迎即使对于单一平台也能确认支持(或缺乏支持)的答案.如果有任何警告,请提供支持的任何警告.
从C++ 11开始,我们可以使用auto a = 1+2而不是int a = 1+2编译器,并且编译器会a自行推断出类型.它是如何工作的?编译时(更多操作)比自己声明类型更慢吗?