小编Nic*_*ton的帖子

我是否需要显式调用基本虚拟析构函数?

当用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++ destructor

327
推荐指数
7
解决办法
13万
查看次数

返回C++引用变量的做法是邪恶的吗?

我觉得这有点主观; 我不确定这个意见是否会一致(我已经看过很多代码片段,其中返回了引用).

根据对这个问题的评论我刚刚问过,关于初始化引用,返回引用可能是邪恶的,因为,[据我所知]它更容易错过删除它,这可能导致内存泄漏.

这让我很担心,因为我跟随了一些例子(除非我想象的事情)并且在相当多的地方做到了这一点......我误解了吗?这是邪恶的吗?如果是这样,那有多邪恶?

我觉得因为我的指针和引用混合在一起,再加上我是C++的新手,以及对什么时候使用的完全混淆,我的应用程序必须是内存泄漏地狱......

另外,我知道使用智能/共享指针通常被认为是避免内存泄漏的最佳方法.

c++ reference c++-faq

325
推荐指数
8
解决办法
28万
查看次数

我什么时候应该在C++中使用new关键字?

我一直在使用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++类.

我应该使用哪种方法?

更新1:

我最近使用new关键字作为内存(或免费存储)用于超出范围的大型数组(即从函数返回).在我使用堆栈之前,导致一半的元素在范围之外被破坏,切换到堆使用确保元素是完整的.好极了!

更新2:

我的一位朋友最近告诉我,使用new关键字有一个简单的规则; 每次打字new,输入delete.

Foobar *foobar = new Foobar();
delete foobar; // TODO: Move this to the right place.
Run Code Online (Sandbox Code Playgroud)

这有助于防止内存泄漏,因为您总是必须将删除放在某处(即,当您将其剪切并粘贴到析构函数或其他方式时).

c++ pointers reference keyword new-operator

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

delete会调用析构函数吗?

我有一个类(A),它为其中一个字段使用堆内存分配.A类被实例化并作为指针字段存储在另一个类(B)中.

当我完成对象B时,我调用delete,我假设调用了析构函数...但是这也调用了A类中的析构函数吗?

编辑:

从答案中,我接受了(请编辑,如果不正确):

  1. class A B的实例调用B :: ~B();
  2. 哪个叫 class B
  3. delete 应该显式地将delete所有堆分配的成员变量A;
  4. 最后,存储所述B实例的内存块返回到堆中 - 当使用new时,它首先在堆上分配一块内存,然后调用构造函数来初始化它,现在在调用所有析构函数来完成对象之后对象所在的块返回到堆.

c++ destructor memory-management base-class delete-operator

161
推荐指数
5
解决办法
27万
查看次数

如何在一行上连接多个C++字符串?

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++ string compiler-errors concatenation

136
推荐指数
10
解决办法
38万
查看次数

如何在C++中从stringstream转换为字符串?

如何从C++ 转换std::stringstreamstd::string

我是否需要在字符串流上调用方法?

c++ string stringstream

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

如何检测Python是否作为64位应用程序运行?

可能重复:
如何确定我的python shell是在32位还是64位模式下执行?

我正在使用Windows注册表做一些工作.根据您是以32位还是64位运行python,键值将不同.如何检测Python是作为64位应用程序而不是32位应用程序运行?

注意:我对检测32位/ 64位Windows不感兴趣 - 只是Python平台.

python 64-bit

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

使用[]时,为什么C++ map类型参数需要空构造函数?

另请参见 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()'的匹配函数

如果我添加一个默认构造函数,这编译很好; 我确信它不是由不正确的语法引起的.

c++ dictionary

88
推荐指数
3
解决办法
3万
查看次数

在Perl中检查字符串是否为空的正确方法是什么?

我刚刚使用此代码来检查字符串是否为空:

if ($str == "")
{
  // ...
}
Run Code Online (Sandbox Code Playgroud)

和不等于运算符的情况一样......

if ($str != "")
{
  // ...
}
Run Code Online (Sandbox Code Playgroud)

这似乎有用(我认为),但我不确定这是正确的方法,还是有任何不可预见的缺点.对此感觉不对劲.

string perl comparison

88
推荐指数
6
解决办法
18万
查看次数

你如何决定使用什么端口?

这有点主观,因为没有规则可以这么说.每次我创建服务器时,我都会对自己说:"最好使用的端口是什么?" 我猜答案是"任何,只要用户可以改变它." 那么,其他人如何决定如何选择默认端口?就个人而言,我喜欢使用像8000这样的东西,如果它与HTTP相关,我注意到这是一个非常普遍的趋势.但是如果8000已经在使用呢?使用8001?这看起来有点特别,我想是的.

显然,我不是第一个提出这个问题的人; IANA维护一个端口号列表...这导致我进入未分配的范围(48620-49150).我想我们应该真的使用这些,但为什么没有更多的程序员这样做呢?你如何决定使用哪个; 如果每个人都从#1开始,那么我们都将使用48620.

port-number

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