相关疑难解决方法(0)

创建类的实例

第1,2,3,4行有什么区别?

我什么时候使用?

为什么第3行打印constructor Foo和第7行返回错误而第8行没有?

#include <iostream>     
using namespace std;

class Foo
 {
   public:
   Foo ( )
   {
      cout << "constructor Foo\n";
   }               
};

class Bar
 {
   public:
   Bar ( Foo )
   {
      cout << "constructor Bar\n";
   }
};

int main()
{
   /* 1 */ Foo* foo1 = new Foo ();
   /* 2 */ Foo* foo2 = new Foo;
   /* 3 */ Foo foo3;
   /* 4 */ Foo foo4 = Foo::Foo();

   /* 5 */ Bar* bar1 = new Bar …
Run Code Online (Sandbox Code Playgroud)

c++ constructor class

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

垃圾收集是否在标准C++中自动进行?

根据我的理解,在标准C++中,无论何时使用new运算符,您还必须在某些时候使用delete运算符来防止内存泄漏.这是因为C++中没有垃圾收集.在.NET中,垃圾收集是自动的,因此无需担心内存管理.我的理解是否正确?谢谢.

.net c++ garbage-collection

14
推荐指数
3
解决办法
4678
查看次数

在析构函数中删除指针时崩溃

我遇到了对C++指针缺乏深刻理解的问题.我写了一个名为Skymap的类,它有以下定义:

class Skymap {
 public:
  Skymap();
  ~Skymap();
  void DrawAitoffSkymap();
 private:
  TCanvas mCanvas;

  TBox* mSkymapBorderBox;
};
Run Code Online (Sandbox Code Playgroud)

功能定义为:

#include "Skymap.h"

Skymap::Skymap()
{
  mCanvas.SetCanvasSize(1200,800);
  mMarkerType=1;
}

Skymap::~Skymap()
{
  delete mSkymapBorderBox;
}

void Skymap::DrawAitoffSkymap()
{
  TBox* mSkymapBorderBox=new TBox(-200,-100,200,100);
  //Use the mSkymapBorderBox pointer for a while
}
Run Code Online (Sandbox Code Playgroud)

(我正在使用ROOT绘图包,但我认为这只是一个普通的C++问题).

现在,以下程序在到达skymap2的析构函数时会崩溃:

int main(){
  Skymap skymap1;
  Skymap skymap2;
  skymap1.DrawAitoffSkymap();
  skymap2.DrawAitoffSkymap();
  return(0);
}
Run Code Online (Sandbox Code Playgroud)

但是,以下内容不会崩溃:

int main(){
  Skymap skymap1;
  skymap1.DrawAitoffSkymap();
  return(0);
}
Run Code Online (Sandbox Code Playgroud)

此外,如果我在构造函数中将指针mSkymapBorderBox初始化为NULL,则在执行第一个程序(使用2个Skymap对象)后,我不会再遇到崩溃.

任何人都可以解释一下其根本原因是什么?它似乎是第二个Skymap对象中指针的问题,但我看不出它是什么.

c++ pointers destructor

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

什么是C++中的动态内存分配?

我学习用C动态内存分配++和关键字newnew[]被提及.据说,用户可以在运行时指定内存分配的大小,而不像在源代码中声明一个具有固定大小的变量或数组.

我不明白这个概念.它是如何工作的?我只需要澄清这个想法,一个例子会有所帮助!

c++ malloc memory-management new-operator dynamic-allocation

4
推荐指数
2
解决办法
3788
查看次数

返回dereferenced new - 内存泄漏?

我想知道这是否会导致内存泄漏:

std::string test() {
    return *(new std::string(""));
}
Run Code Online (Sandbox Code Playgroud)

c++ memory-leaks

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

unique_ptr有一个期望原始指针的API?

在使用托管内存和函数式语言大约10年之后,我终于回到了C++,并且智能指针让我感到困惑.有一半的文档仍然是关于已弃用的auto_ptr.

我正在尝试实施这个相当简单的Bullet "hello world"程序:

int _tmain(int argc, _TCHAR* argv[])
{
    auto bp = unique_ptr<btBroadphaseInterface>(new btDbvtBroadphase);
    auto cc = unique_ptr<btDefaultCollisionConfiguration>(new btDefaultCollisionConfiguration);
    auto disp = unique_ptr<btDispatcher>(new btCollisionDispatcher(cc));
}
Run Code Online (Sandbox Code Playgroud)

btCollisionDispatcher构造想要一个btCollisionConfiguration*,但我它赋予unique_ptr一个替代.

在这种情况下我通常想做什么?如果有一种"去智能"指针的方法,有些东西告诉我这unique_ptr不是正确使用的智能指针.

在此输入图像描述

在转向其他事情之前,C++是我的首选语言.这有点令人震惊,并且看到所有模式和实践都已完全改变.

c++ smart-pointers c++11

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

声明变量vs动态地将内存分配给c ++中的变量?

我只是在声明一个变量之间的区别时有点困惑,例如:

int n;
Run Code Online (Sandbox Code Playgroud)

并使用"new"动态地将内存分配给变量,例如:

int m = new int;
Run Code Online (Sandbox Code Playgroud)

我注意到只是在处理一个简单的链表项目时,当我以节点对象的形式插入一个新值时,我必须动态创建一个新的节点对象并将所需的值附加到它,然后将其链接到我列表的其余部分.但是..在同一个函数中,我可以定义另一个节点对象,例如.NodeType*N. 并使用此指针遍历我的列表.我的问题是..当我们只是声明一个变量时,内存是不是立刻被分配了......或者有什么区别?

谢谢!

c++ variables

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

如何包装对`std :: thread`构造函数的调用?(适用于gcc,VS和icpc)

原帖(有错误)

我想包装一个对std :: thread构造函数的调用(以跟踪所有运行的线程,以便我可以加入它们或做其他事情).在此示例中,t1线程正确构造,但t2线程不使用gcc 4.8.1.但是,在Windows(VS2012)上,它编译时没有错误,并且运行没有错误.基于此处的讨论,这似乎是gcc中的一个错误,但可以说它实际上是VS中的一个错误.这样做的正确方法是什么?

#include <iostream>
#include <thread>

class A {
public:
    void foo(int n ) { std::cout << n << std::endl; }
};

template<class F, class Arg>
std::thread& wrapper(F&& f, Arg&& a)
{
   std::thread* t = new std::thread(f,a,100);
   return *t;
}

int main()
{
    A a;

    std::thread t1(&A::foo, &a, 100);
    t1.join();

    std::thread t2 = wrapper(&A::foo, &a);
    t2.join();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是编译器错误

-bash-4.1$ make
g++ -std=c++11    main.cpp   -o main
main.cpp: In function ‘int …
Run Code Online (Sandbox Code Playgroud)

c++ icc c++11 stdthread

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

使用g ++编译主模块的奇怪错误

我试图使用"g ++ main.cpp -c"编译下面的代码,但它给了我这个奇怪的错误..任何想法?

main.cpp: In function ‘int main()’:
main.cpp:9:17: error: invalid conversion from ‘Graph*’ to ‘int’
main.cpp:9:17: error:   initializing argument 1 of ‘Graph::Graph(int)’
main.cpp:10:16: warning: deprecated conversion from string constant to ‘char*’
Run Code Online (Sandbox Code Playgroud)

这是我正在尝试编译的主要模块,下面是我在graph.hpp中的图形类

#include <iostream>
#include "graph.hpp"

using namespace std;

int main()
{
  Graph g;
  g = new Graph();
  char* path = "graph.csv";
  g.createGraph(path);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是我的Graph类

    /*
 * graph.hpp
 *
 *  Created on: Jan 28, 2012
 *      Author: ajinkya
 */

#ifndef _GRAPH_HPP_
#define _GRAPH_HPP_

#include "street.hpp"
#include …
Run Code Online (Sandbox Code Playgroud)

c++ g++

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

删除自动int变量

我正在努力学习C++中的最佳习惯和实践,特别是围绕内存管理.通过在我的iOS应用程序中使用ARC,以及使用Java中的内置GC以及其他一些启用了GC的语言,我已经被宠坏了.

我知道你使用deletedelete[]解构指针.我的问题是,你如何delete整数或基本数据类型的其他变量?

我的第一个想法是,因为delete似乎只能使用指针,我可以这样做:

int intToDelete = 6;
delete &intToDelete;
Run Code Online (Sandbox Code Playgroud)

所以基本上,你可以在内存中创建一个指向整数的指针,并使用该指针删除整数吗?

c++ memory-management

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