标签: pointers

C++ delete - 删除我的对象,但我仍然可以访问数据?

我写了一个简单的,工作的俄罗斯方块游戏,每个块作为类单块的一个实例.

class SingleBlock
{
    public:
    SingleBlock(int, int);
    ~SingleBlock();

    int x;
    int y;
    SingleBlock *next;
};

class MultiBlock
{
    public:
    MultiBlock(int, int);

    SingleBlock *c, *d, *e, *f;
};

SingleBlock::SingleBlock(int a, int b)
{
    x = a;
    y = b;
}

SingleBlock::~SingleBlock()
{
    x = 222;
}

MultiBlock::MultiBlock(int a, int b)
{
    c = new SingleBlock (a,b);
    d = c->next = new SingleBlock (a+10,b);
    e = d->next = new SingleBlock (a+20,b);
    f = e->next = new SingleBlock (a+30,b);
}
Run Code Online (Sandbox Code Playgroud)

我有一个扫描完整行的函数,并运行删除相关的块的链接列表并重新分配 - >下一个指针. …

c++ pointers c++-faq undefined-behavior

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

如何在函数内返回其值后删除指针

我有这个功能:

char* ReadBlock(fstream& stream, int size)
{
    char* memblock;
    memblock = new char[size];
    stream.read(memblock, size);
    return(memblock);
}
Run Code Online (Sandbox Code Playgroud)

每次我必须从文件中读取字节时,都会调用该函数.我认为每次使用它都会分配新的内存,但是一旦我处理了数组内的数据,我怎么能释放内存呢?我可以从功能外部做到吗?通过分配大块处理数据比分配和删除小块数据提供更好的性能?

非常感谢您的帮助!

c++ pointers memory-management

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

有关函数指针大小的保证是什么?

在C中,我需要知道结构的大小,其中包含函数指针.我可以保证在所有平台和架构上:

  • void*的大小与函数指针的大小相同?
  • 由于返回类型,函数指针的大小没有差异?
  • 由于参数类型的不同,函数指针的大小没有差异?

我认为所有这些答案都是肯定的,但我想确定.对于上下文,我正在呼唤sizeof(struct mystruct),仅此而已.

c pointers function-pointers sizeof type-conversion

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

删除指向指针的指针(作为数组的数组)

我的代码中有这个:

double** desc = new double* [size_out];
for (int i = 0; i < size_out; i++)
    desc[i] = new double [size_in];
Run Code Online (Sandbox Code Playgroud)

我该如何删除desc

我应该这样做:

delete [] desc;
Run Code Online (Sandbox Code Playgroud)

要么

for (int i=0; i<size_out; i++)
    delete [] desc[i];
delete [] desc;
Run Code Online (Sandbox Code Playgroud)

要么

for (int i=0; i<size_out; i++)
    delete [] desc[i];
delete desc;
Run Code Online (Sandbox Code Playgroud)

c++ pointers delete-operator

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

为什么常量指针不能成为常量表达式?

以下程序编译:

template <const int * P>
class Test{};

extern const int var = 42; //extern needed to force external linkage

int main()
{
    Test<&var> test;
}
Run Code Online (Sandbox Code Playgroud)

然而,这个没有,这对我来说是一个惊喜:

template <const int * P>
class Test{};

extern const int var = 42; //extern needed to force external linkage
extern const int * const ptr = &var; //extern needed to force external linkage
int main()
{
    Test<ptr> test; //FAIL! Expected constant expression.
}
Run Code Online (Sandbox Code Playgroud)

替代示例:

int main()
{
   const int size = 42;
   int …
Run Code Online (Sandbox Code Playgroud)

c++ pointers constant-expression c++11

30
推荐指数
1
解决办法
4104
查看次数

30
推荐指数
6
解决办法
2610
查看次数

C++模板专门化,可以明确地调用可以作为指针或引用的类型的方法

摘要

有没有办法在模板化类型上调用类方法,该模板可能是指针或引用而不知道哪个而不是获取编译器/链接器错误?


细节

我有一个模板化的QuadTree实现,可以采用以下任何非平凡的用户定义类型:

//Abstract Base Class
a2de::Shape

//Derived Classes
a2de::Point
a2de::Line
a2de::Rectangle
a2de::Circle
a2de::Ellipse
a2de::Triangle
a2de::Arc
a2de::Spline
a2de::Sector
a2de::Polygon
Run Code Online (Sandbox Code Playgroud)

但它们可能是指针或引用,因为它们都是从a2de :: Shape派生的.因此专业化被声明为:

template class QuadTree<a2de::Shape&>;
//...similar for all derived types as references.

template class QuadTree<a2de::Shape*>;
//...similar for all derived types as pointers
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是当间接(或缺少)未知时调用类方法的能力,并且由于模板,生成了两组代码:

template<typename T>
bool QuadTree<T>::Add(T& elem) {

    //When elem of type T is expecting a pointer here
    //-> notation fails to compile where T is a reference i.e.:
    //template class QuadTree<a2de::Shape&>
    //with "pointer to reference is illegal" …
Run Code Online (Sandbox Code Playgroud)

c++ templates pointers reference template-specialization

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

sizeof(&array)返回什么?

问题是:为什么数组的地址等于它在C中的值?

#include <stdio.h>
#define N 10    
char str2[N]={"Hello"};
int main(){
    printf("sizeof(str2): %d bytes\n", sizeof(str2));
    printf("sizeof(&str2): %d bytes\n", sizeof(&str2));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

sizeof(str2): 10 bytes
sizeof(&str2): 4 bytes
Run Code Online (Sandbox Code Playgroud)

我知道str2单独是数组中第一个元素的地址str2.并且当str2它的参数何时sizeof返回整个数组str2的大小.

另外,&str2也是arr中第一个元素的地址,str2但是来自不同的类型(char (*)[N]==指向数组的指针).但是&str2当它是一个论证时,它是如何表现的sizeof

c string pointers sizeof

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

如何在包中的文件中使用全局var?

我有以下文件结构:

车型/ db.go

type DB struct {
    *sql.DB
}

var db *DB

func init() {
    dbinfo := fmt.Sprintf("user=%s password=%s dbname=%s sslmode=disable",
        DB_USER, DB_PASSWORD, DB_NAME)

    db, err := NewDB(dbinfo)
    checkErr(err)

    rows, err := db.Query("SELECT * FROM profile")
    checkErr(err)

    fmt.Println(rows)
}

func NewDB(dataSourceName string) (*DB, error) {
    db, err := sql.Open("postgres", dataSourceName)
    if err != nil {
        return nil, err
    }
    if err = db.Ping(); err != nil {
        return nil, err
    }
    return &DB{db}, nil
}
Run Code Online (Sandbox Code Playgroud)

车型/ db_util.go

func (p *Profile) …
Run Code Online (Sandbox Code Playgroud)

pointers database-connection go nullreferenceexception

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

为什么我的程序在递增指针然后删除它时会崩溃?

当我意识到我对指针有很大的误解时,我正在解决一些编程练习.请有人解释一下这段代码导致C++崩溃的原因.

#include <iostream>

int main()
{
    int* someInts = new int[5];

    someInts[0] = 1; 
    someInts[1] = 1;

    std::cout << *someInts;
    someInts++; //This line causes program to crash 

    delete[] someInts;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

PS我知道没有理由在这里使用"new",我只是尽可能地使用这个例子.

c++ pointers dynamic-memory-allocation delete-operator

30
推荐指数
4
解决办法
4905
查看次数