当用C++覆盖一个类(使用虚拟析构函数)时,我在继承类上再次将析构函数实现为虚拟,但是我是否需要调用基本析构函数?
如果是这样,我想它就是这样......
MyChildClass::~MyChildClass() // virtual in header
{
// Call to base destructor...
this->MyBaseClass::~MyBaseClass();
// Some destructing specific to MyChildClass
}
Run Code Online (Sandbox Code Playgroud)
我对吗?
我觉得这有点主观; 我不确定这个意见是否会一致(我已经看过很多代码片段,其中返回了引用).
根据对这个问题的评论我刚刚问过,关于初始化引用,返回引用可能是邪恶的,因为,[据我所知]它更容易错过删除它,这可能导致内存泄漏.
这让我很担心,因为我跟随了一些例子(除非我想象的事情)并且在相当多的地方做到了这一点......我误解了吗?这是邪恶的吗?如果是这样,那有多邪恶?
我觉得因为我的指针和引用混合在一起,再加上我是C++的新手,以及对什么时候使用的完全混淆,我的应用程序必须是内存泄漏地狱......
另外,我知道使用智能/共享指针通常被认为是避免内存泄漏的最佳方法.
我一直在使用C++,我一直在想新的关键字.简单地说,我应该使用它吗?
1)使用新关键字...
MyClass* myClass = new MyClass();
myClass->MyField = "Hello world!";
Run Code Online (Sandbox Code Playgroud)
2)没有新的关键字......
MyClass myClass;
myClass.MyField = "Hello world!";
Run Code Online (Sandbox Code Playgroud)
从实现的角度来看,它们看起来并没有什么不同(但我确定它们是......)但是,我的主要语言是C#,当然第一种方法就是我习惯的方法.
困难似乎是方法1更难用于std C++类.
我应该使用哪种方法?
我最近使用new关键字作为堆内存(或免费存储)用于超出范围的大型数组(即从函数返回).在我使用堆栈之前,导致一半的元素在范围之外被破坏,切换到堆使用确保元素是完整的.好极了!
我的一位朋友最近告诉我,使用new关键字有一个简单的规则; 每次打字new,输入delete.
Foobar *foobar = new Foobar();
delete foobar; // TODO: Move this to the right place.
Run Code Online (Sandbox Code Playgroud)
这有助于防止内存泄漏,因为您总是必须将删除放在某处(即,当您将其剪切并粘贴到析构函数或其他方式时).
我有一个类(A),它为其中一个字段使用堆内存分配.A类被实例化并作为指针字段存储在另一个类(B)中.
当我完成对象B时,我调用delete,我假设调用了析构函数...但是这也调用了A类中的析构函数吗?
从答案中,我接受了(请编辑,如果不正确):
class A B的实例调用B :: ~B();class Bdelete 应该显式地将delete所有堆分配的成员变量A;C#具有语法功能,您可以在一行中将多种数据类型连接在一起.
string s = new String();
s += "Hello world, " + myInt + niceToSeeYouString;
s += someChar1 + interestingDecimal + someChar2;
Run Code Online (Sandbox Code Playgroud)
什么是C++中的等价物?据我所知,你必须在单独的行上完成所有操作,因为它不支持使用+运算符的多个字符串/变量.这没关系,但看起来并不整洁.
string s;
s += "Hello world, " + "nice to see you, " + "or not.";
Run Code Online (Sandbox Code Playgroud)
上面的代码产生错误.
如何从C++ 转换std::stringstream为std::string?
我是否需要在字符串流上调用方法?
我正在使用Windows注册表做一些工作.根据您是以32位还是64位运行python,键值将不同.如何检测Python是作为64位应用程序而不是32位应用程序运行?
注意:我对检测32位/ 64位Windows不感兴趣 - 只是Python平台.
另请参见 C++标准列表和默认构造类型
不是一个主要问题,只是烦人,因为我不希望我的类在没有特定参数的情况下被实例化.
#include <map>
struct MyClass
{
MyClass(int t);
};
int main() {
std::map<int, MyClass> myMap;
myMap[14] = MyClass(42);
}
Run Code Online (Sandbox Code Playgroud)
这给了我以下g ++错误:
/usr/include/c++/4.3/bits/stl_map.h:419:错误:没有用于调用'MyClass()'的匹配函数
如果我添加一个默认构造函数,这编译很好; 我确信它不是由不正确的语法引起的.
我刚刚使用此代码来检查字符串是否为空:
if ($str == "")
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
和不等于运算符的情况一样......
if ($str != "")
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
这似乎有用(我认为),但我不确定这是正确的方法,还是有任何不可预见的缺点.对此感觉不对劲.
这有点主观,因为没有规则可以这么说.每次我创建服务器时,我都会对自己说:"最好使用的端口是什么?" 我猜的答案是"任何,只要用户可以改变它." 那么,其他人如何决定如何选择默认端口?就个人而言,我喜欢使用像8000这样的东西,如果它与HTTP相关,我注意到这是一个非常普遍的趋势.但是如果8000已经在使用呢?使用8001?这看起来有点特别,我想是的.
显然,我不是第一个提出这个问题的人; IANA维护一个端口号列表...这导致我进入未分配的范围(48620-49150).我想我们应该真的使用这些,但为什么没有更多的程序员这样做呢?你如何决定使用哪个; 如果每个人都从#1开始,那么我们都将使用48620.
c++ ×7
string ×3
destructor ×2
reference ×2
64-bit ×1
base-class ×1
c++-faq ×1
comparison ×1
dictionary ×1
keyword ×1
new-operator ×1
perl ×1
pointers ×1
port-number ×1
python ×1
stringstream ×1