我宣布:
vector<int> * part = new vector<int>[indmap];
Run Code Online (Sandbox Code Playgroud)
好吧,我知道:"你为什么不申报矢量向量?".下次我会这样做,但现在我想了解更多关于我无法解决的向量的问题.
现在我想释放所有资源,我该做什么?
delete[] part;
Run Code Online (Sandbox Code Playgroud)
但在删除数组之前,我该怎么做才能删除所有的矢量对象?
实例:
weapons.push_back(new Pistol());
weapons.push_back(new Rifle());
weapons.push_back(new Shotgun());
Run Code Online (Sandbox Code Playgroud)
析构函数,当第一次删除时,代码中断.当我关闭程序时会发生这种情况.
Brain::~Brain()
{
for (unsigned int i = 0; i < weapons.size(); i++)
{
delete weapons[i]; // this is where the code breaks
}
}
Run Code Online (Sandbox Code Playgroud)
我收到警告:
Unhandled exception at 0x0096371f in D3D10DEMO.exe: 0xC0000005: Access violation reading location 0x000002ce.
Run Code Online (Sandbox Code Playgroud)
武器是这样的:
weapons(vector<Gun*>())
Run Code Online (Sandbox Code Playgroud)
编辑 - 我已经删除了这个问题的大部分代码,但是我也减少了我的程序,以便在一个更小的解决方案中重现问题:
我试图创建一个头文件中定义的自定义对象的向量,然后在实际的cpp文件中初始化它们.我在Visual Studio中遇到以下错误:
error C2976: 'std::vector' : too few template arguments
error C2065: 'Particle' : undeclared identifier
error C2059: syntax error : '>'
Run Code Online (Sandbox Code Playgroud)
在下面的代码中,向量在Explosion.h中定义.
#pragma once
class Particle : public sf::CircleShape {
public:
float speed;
bool alive;
float vx;
float vy;
Particle(float x, float y, float vx, float vy, sf::Color color);
~Particle();
};
Run Code Online (Sandbox Code Playgroud)
#include <SFML/Graphics.hpp>
#include "Particle.h"
Particle::Particle(float x, float y, float vx, float vy, sf::Color color) {
// Inherited
this->setPosition(x, y);
this->setRadius(5);
this->setFillColor(color);
// Player Defined Variables
this->speed …Run Code Online (Sandbox Code Playgroud) 在我的程序中,我有一些用于在游戏中处理射弹的类.
class Projectile
{
bool IsActive;
bool GetActive();
//....
};
class Game
{
std::vector<Projectile*> ProjectilesToUpdate;
//....
};
Run Code Online (Sandbox Code Playgroud)
当然,除此之外还有更多,但我试图保持与当前问题的相关性.
我想使用std :: sort来制作它,以便IsActive == true的所有射弹都处于远端,并且任何非活动的射弹都在最后.
我该怎么做呢?
Java和C/C++之间最大的区别在于Java有一个指针模型,可以消除覆盖内存和破坏数据的可能性.
这是教科书的引用.我一直认为使用指针而不是Java是C++.有人可以详细说明吗?
有没有办法在运行时区分以下两种情况:
double ptr * = new double(3.14159);
double variable = 3.14159
double * testPtr_1 = ptr;
double * testPtr_2 = &variable;
delete testPtr_1 // fine...
delete testPtr_2 // BIG RUN TIME ERROR !!!
Run Code Online (Sandbox Code Playgroud)
我发现自己陷入困境,我需要调用delete操作符来获取一些未知指针.指针可以指向任何位置(指向"本地"变量或动态分配的变量).
我怎样才能找到我的"未知"指针指向的位置,因此选择何时何时不要调用operator delete它
编辑:
好的我看到每个人都指着智能指针,但如果我想写自己的指针怎么办?一套智能指针(这是我的问题背后的原因)?
我试图实现一个双向链表,其中节点存储在堆栈上,但堆上的节点数据.您可以使用push()将包含数据的新节点添加到列表中,并使用pop()删除最后一个元素.
我有push()方法的问题.
#include <iostream>
using namespace std;
struct Data {
string name;
int age;
};
struct Node {
struct Node *next;
struct Node *previous;
struct Data *d;
};
struct Node *first;
struct Node *last;
void init() {
first = last = NULL;
}
void push(Data d) {
Node *temp;
if(first == NULL){
first = new Node();
first->d = malloc(sizeof(struct Data *));
first->next = NULL;
first->previous = NULL;
last = first;
} else if(last->next == NULL) {
last->next = new Node(); …Run Code Online (Sandbox Code Playgroud) 我是智能指针的新手,我正在尝试创建一个双树,其中子节点通过唯一指针从父节点指向,并且子节点通过原始指针指向父节点.因此,当父节点被销毁时,整个子树将在该过程中被销毁.
class Node {
private:
Node *parent;
std::unique_ptr<Node> left;
std::unique_ptr<Node> right;
public:
Node(Node* _left, Node* _right, Node* _parent);
};
Node::Node(Node* _left, Node* _right, Node* _parent) {
parent = &_parent;
//this is where the problem starts
}
Run Code Online (Sandbox Code Playgroud)
我不明白如何指向一个可能有我要连接的树的新节点.如果我使用make_unique,我相信会创建一个新节点而不是保留树.
我可能完全错了,因为我刚刚学习了4天前的智能指针(实际上有足够的时间学习一些东西).
假设我有一个指针void* p,然后在一些传入和传出函数后,让我们说p现在指向int.然后我需要手动删除delete static_cast<int*>(p)吗?
在大多数地方,人们说delete只有在有的时候才会发生new.但在这种情况下,它不是,但C++本身还记得发布那个内存吗?
从理论上讲,如果仅删除以下代码片段中的内容arrays,results而又不删除它的sub_array内部内容,arrays就可以了,return 0;或者必须首先删除所有内容,sub_array然后才能安全地删除arrays和results。
int main() {
int subarrays, queries;
cin >> subarrays >> queries;
int** arrays = new int* [subarrays]();
int* results = new int[queries];
for (int i = 0; i < subarrays; i++) {
int length;
cin >> length;
int* sub_array = new int[length];
for (int j = 0; j < length; j++) {
int element;
cin >> element;
sub_array[j] = element;
}
arrays[i] …Run Code Online (Sandbox Code Playgroud)