我是一个c ++ n00b,我不确定我是否找到了合适的地方,但我对此感到困惑:
include <iostream>
using namespace std;
class Enemy
{
public:
void sayHere()
{
cout<<"Here"<<endl;
}
virtual void attack()
{
}
};
class Monster: public Enemy
{
public:
virtual void attack()
{
cout<<"RAWR"<<endl;
}
};
class Ninja: public Enemy
{
public:
virtual void attack()
{
cout<<"Hiya!"<<endl;
}
};
int main()
{
Ninja n;
Monster m;
Enemy enemies[2];
enemies[0] = m;
enemies[1] = n;
for(int i = 0; i<2; i++)
{
enemies[i].sayHere();
enemies[i].attack();//Will not be overriden
}
return 0;
} …Run Code Online (Sandbox Code Playgroud) 我目前正在自学C++,并尝试使用部分完成的指针在C++中实现双向链表.我知道代码当前无法处理悬空节点或输出错误,我将在下面介绍这两个节点.但是,代码应该至少能够构造一个列表对象并向其添加元素.目前,当我尝试调用列表的构造函数时,我收到一个错误,表示我正在请求从LinkedList*到非标量类型LinkedList的转换.为什么我的列表被声明为指针?非常感谢任何帮助,谢谢!
LinkedList.h
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
struct dataElement {
int key;
int id;
};
struct Node
{
dataElement data;
Node* next;
Node* prev;
};
class LinkedList
{
public:
/** Default constructor */
LinkedList();
/** Default destructor */
virtual ~LinkedList();
void addAtFront(int newElement);
void addAtBack(int newElement);
int removeTop();
int removeBottom();
int getTop();
int getBottom();
int findKey(int keyToFind);
protected:
private:
Node* head;
Node* tail;
int size;
};
#endif // LINKEDLIST_H
LinkedList.cpp
#include "LinkedList.h"
#include <iostream>
#include <stdlib.h>
LinkedList::LinkedList()
{
size = 0; …Run Code Online (Sandbox Code Playgroud) int a = 0;
int *b = malloc (sizeof(int));
b = malloc (sizeof(int));
Run Code Online (Sandbox Code Playgroud)
上面的代码很糟糕,因为它在堆上分配内存然后不释放它,这意味着您将无法访问它.但是你也创建了'a'并且从未使用它,所以你也在堆栈上分配了内存,在范围结束之前不会释放内存.
那么为什么不在堆上释放内存,但是没有释放堆栈上的内存(直到作用域结束)是不好的做法?
注意:我知道堆栈上的内存无法释放,我想知道为什么它不被认为是坏的.
void local () {
int x = 100;
double *loc;
loc = (double *) malloc(sizeof(double)*100);
memset(rxnrun, 0x0, sizeof(double)*100);
// perform some operations
// free(loc);
return; // without doing free for loc variable
}
Run Code Online (Sandbox Code Playgroud)
在这里,我可以看到有什么问题,因为内存泄漏是loc变量.但是,变量x怎么样?如果我们在函数返回后保留变量x以及loc变量无人值守(非自由),那么两个变量获取的内存空间会发生什么?
他们(两个变量)还会获得空间吗?
作为学习实验,我有兴趣在汇编中创建一个哈希表(OSX 上 NASM 中的 x86-64)。要求之一是能够动态分配/管理内存。
在查看了许多关于如何在汇编中分配内存的资源后,他们中的大多数人推荐brk或mmap系统调用。我还没有确切地了解这些是如何工作的,因为我在BareMetal-OS中发现了另一种不使用任何系统调用的内存分配实现(复制了下面的代码)。
我的问题是,他们是如何做到这一点的?您能否为没有系统编程背景且不熟悉汇编的人解释其汇编中执行内存分配的相关指令?想了解如何在汇编中实现内存分配的原因是为了能够在汇编中实现哈希表。
刚接触汇编(我主要是做 JavaScript),还没有找到任何关于汇编内存分配的详细资源,我不知道从哪里开始。这对你来说可能很明显,但你有背景,而我没有。我在过去一两周完成了一些汇编,所以我了解有关mov寄存器和跳转命令的基础知识,但还不了解他们为实现这些内存内容所做的其他工作。我的想法是,如果他们可以在没有brkor 的情况下在汇编中实现内存分配mmap,那么我想这样做,因为那样我真的是在没有任何系统层的情况下直接操作内存,而且看起来你真的可以微调一些东西。
这是他们从 GitHub 复制的代码:
https://github.com/ReturnInfinity/BareMetal-OS/blob/master/os/syscalls/memory.asm
# =============================================================================
# BareMetal -- a 64-bit OS written in Assembly for x86-64 systems
# Copyright (C) 2008-2014 Return Infinity -- see LICENSE.TXT
#
# Memory functions
# =============================================================================
align 16
db 'DEBUG: MEMORY '
align 16
# -----------------------------------------------------------------------------
# os_mem_allocate -- Allocates the requested number of 2 MiB pages
# IN: …Run Code Online (Sandbox Code Playgroud) 我有一个简单的问题:哪种数据结构是堆栈?它是静态数据结构还是动态数据结构?我一直在寻找答案但找不到它,因此我得到了自己的“解释” - 我想,当您可以通过使用数组或链表来实现它时,它可以......两者兼而有之?,取决于关于实施?我的推理有意义吗?
以下两种在C中创建数组的方法是否相同?
int main( void )
{
int *array = malloc(sizeof(int) * 10);
int array2[10];
}
Run Code Online (Sandbox Code Playgroud)
我的想法是方法二是方法一的语法糖,但我不确定.
另外,在这些声明之后,array和array2包含了什么?我知道数组是指向数组开头的指针,但是数组初始化为什么?对于array2怎么样?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
char * upperCase(const char* s)
{
char * ret = NULL;
size_t length = strlen(s) + 1;
ret = (char*)malloc(sizeof(char) * length);
for (size_t i = 0; i < length; i++) {
ret[i] = toupper(s[i]);
}
return ret;
}
int main()
{
char* ret = NULL;
char* input = "HelloWorld";
ret = upperCase(input);
printf("value = %s", ret);
free(ret);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码将字符串作为参数并复制该字符串。然后,它将复制的字符串的每个元素转换为大写并返回。
编译器= GCC 6.2
如果使用malloc函数,是否可以返回局部变量以终止该函数并释放内存?我对仍然具有内存的范围没有足够的了解。
class A{};
void Foo(A *p)
{
std::cout << &p << std::endl;
std::cout << p << std::endl;
}
int main()
{
A *p = new A();
std::cout << &p << std::endl;
std::cout << p << std::endl;
Foo(p);
}
Run Code Online (Sandbox Code Playgroud)
上面的程序为p不同的地址打印相同的值&p.有人可以解释一下原因吗?
我希望得到一些明确的信息,我发现大多数消息来源都令人困惑.
例如,
int *a=new int;
Run Code Online (Sandbox Code Playgroud)
堆栈或堆中的"a",以及"*a"怎么办?我发现的大多数资源只涉及堆,我真的需要一个非常具体的答案.我真的很感激.