gpt4 book ai didi

c++ - 我的新 Unique_ptr 的所有权?

转载 作者:太空宇宙 更新时间:2023-11-04 15:23:04 26 4
gpt4 key购买 nike

根据我最近接受的一次工作面试的建议,我被建议研究 C++11 的 unique_ptr 功能,作为自动垃圾收集的一种方式。因此,我正在使用一个较旧的项目,并将我的原始指针替换为使用“new”关键字创建的对象,并将其替换为 unique_ptrs。但是,我认为我已经遇到了所有权问题。

在我的 mainclass.cpp(下面发布)中,请将您的注意力转移到 init 函数和 3 个指向我创建的新实例化对象的 unique_ptr。命名为“bg”、“bg2”和“theGrid”。(下面注释掉的声明是以前的做法,切换回这个方法,程序运行正常。)

但是,使用 unique_ptr,函数 void display() 中的行:

theGrid->doGridCalculations();//MODEL

生成访问冲突。这也是序列中第一次取消引用任何指向的对象,这让我相信 unique_ptr 的所有权已经在某处丢失了。但是,unique_ptr 本身永远不会传递到另一个函数或容器中,并且保留在 mainclass.cpp 的范围内,因此我没有机会使用 std::move(theGrid) 来将所有权转移到它需要的地方成为。

主类.cpp:

#include <stdio.h>
#include <GL/glut.h>
#include <math.h>
#include "Block.h"
#include "dStructs.h"
#include "Grid.h"
#include "Texture.h"
#include "freetype.h"
#include <Windows.h>


//////////////////////////////////////////////////////
///Declare a couple of textures - for the background
//////////////////////////////////////////
Texture* bg;
Texture* bg2;
//and theGrid
Grid* theGrid;

/////////////////////////////////////////////////
///Declare our font
/////////////////////////////////////////////////
freetype::font_data scoreFont;
/////////////////////////////////////////////////////////
//Initialize the variables
///////////////////////////////////////////////////////
typedef dStructs::point point;
const int XSize = 755, YSize = 600;


point offset = {333,145};
point mousePos = {0,0};


void init(void)
{
//printf("\n......Hello Guy. \n....\nInitilising");
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0,XSize,0,YSize);

//////////////////////////
//initialise the fonts
/////////////////////////


try{
scoreFont.init("Visitor TT2 BRK Regular.ttf", 20);
} catch (std::exception &e) {
MessageBox(NULL, e.what(), "EXCEPTION CAUGHT", MB_OK | MB_ICONINFORMATION);

}
///////////////////////////////////////////////////////////////
///bg new MEMORY MANAGED EDITION
//////////////////////////////////////////////////////////////////
unique_ptr<Texture> bg(new Texture(1024,1024,"BackGround.png"));
unique_ptr<Texture> bg2(new Texture(1024,1024,"BackGround2.png"));
unique_ptr<Grid> theGrid(new Grid(offset));
/////////////////////////////////////////////////
/// Old bad-memory-management style of pointed objects
/////////////////////////////////////////////////
//bg = new Texture(1024,1024,"BackGround.png");
//bg2 = new Texture(1024,1024,"BackGround2.png");
//theGrid = new Grid(offset);

glClearColor(0,0.4,0.7,1);

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);//activate the alpha blending functionality
glEnable(GL_BLEND);
glLineWidth(2); // Width of the drawing line
glMatrixMode(GL_MODELVIEW);
glDisable(GL_DEPTH_TEST);
//printf("\nInitialisation Complete");

}

void myPassiveMouse(int x, int y)
{
//Stupid OGL coordinate system
y = YSize - y;
mousePos.x = x;
mousePos.y = y;
printf("\nthe mouse coordinates are (%f,%f)",mousePos.x, mousePos.y);
}

void displayGameplayHUD()
{
///////////////////////////////
//SCORE
//////////////////////////////
glColor4f(0.7f,0.0f,0.0f,7.0f);//set the colour of the text
freetype::print(scoreFont, 100,400,"SCORE: ");
glColor4f(1.0f,1.0f,1.0f,1.0f);//Default texture colour. Makes text white, and all other texture's as theyre meant to be.

}

//////////////////////////////////////////////////////
void display()
{
////printf("\nBeginning Display");
glClear(GL_COLOR_BUFFER_BIT);//clear the colour buffer

glPushMatrix();
theGrid->doGridCalculations();//MODEL

point bgLoc = {XSize/2,YSize/2};
point bgSize = {XSize,YSize};
bg2->draw(bgLoc,bgSize);
theGrid->drawGrid();//DISPLAY
bg->draw(bgLoc,bgSize);

if(theGrid->gridState == Grid::STATIC)
{
theGrid->hoverOverBlocks(mousePos);//CONTROLLER
}

displayGameplayHUD();

glPopMatrix();

glFlush(); // Finish the drawing
glutSwapBuffers();
////printf("\nFresh Display Loaded");

glutPostRedisplay();
}

int main(int argc, char** argv)
{
glutInit(&argc, argv); // GLUT Initialization
glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE); // Initializing the Display mode
glutInitWindowSize(755,600); // Define the window size
glutCreateWindow("Gem Miners"); // Create the window, with caption.
init(); // All OpenGL initialization


//-- Callback functions ---------------------
glutDisplayFunc(display);
//glutKeyboardFunc(mykey);
//glutSpecialFunc(processSpecialKeys);
//glutSpecialUpFunc(processSpecialUpKeys);
glutMouseFunc(mymouse);

glutPassiveMotionFunc(myPassiveMouse);

glutMainLoop(); // Loop waiting for event
}

我认为所有权需要在某个时候转移,但我不知道转移到哪里。

提前致谢,盖伊

最佳答案

这些是全局原始指针:

Texture* bg;
Texture* bg2;
//and theGrid
Grid* theGrid;

这些是完全不相关的 unique_ptr,局部于 init 函数。

unique_ptr<Texture> bg(new Texture(1024,1024,"BackGround.png"));
unique_ptr<Texture> bg2(new Texture(1024,1024,"BackGround2.png"));
unique_ptr<Grid> theGrid(new Grid(offset));

unique_ptr 超出范围时,它们将被销毁。它们指向的对象也被销毁,因为这是 unique_ptr 在其析构函数中所做的。在这个过程中,全局原始指针丝毫没有涉及崩溃。它们被同名的本地 unique_ptr 隐藏。

您应该将全局原始指针更改为 unique_ptr。然后你可以像这样在 init 函数中设置它们(不要重新声明它们):

bg.reset(new Texture(1024,1024,"BackGround.png"));
bg2.reset(new Texture(1024,1024,"BackGround2.png"));
theGrid.reset(new Grid(offset));

关于c++ - 我的新 Unique_ptr 的所有权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14706631/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com