它是否正确?:
std::vector<Enemy*> enemies;
enemies.push_back(new Enemy());
Enemy* enemy = enemies[0];
enemies.erase(enemies.begin() + 0);
delete enemy;
Run Code Online (Sandbox Code Playgroud) 可能我所要求的只是一个链接到我尚未找到的网站.但是来自Java背景,在C++中处理内存分配和删除的一般原则是什么?我觉得我可能会在我的应用程序中添加各种内存泄漏.我意识到有几种智能指针的变种,你也可以提到它我,但我想专注于标准的C++指针.
我知道RAII做了什么.当代码抛出异常时,它就是防止内存泄漏等.
现在,我希望了解这个聪明术语的含义. http://en.wikipedia.org/wiki/Acquisition
获得意味着获得某些东
那么,当我们说资源获取是初始化时,这意味着什么?
我只是在谈论这里的术语的含义,而不是一般的概念.
为指针使用索引括号是否也取消引用它?为什么打印这个指针的第0个索引两次最终打印两个不同的东西?
#include <cstdlib>
#include <iostream>
#include <cstring>
using namespace std;
int *p;
void fn() {
int num[1];
num[0]=99;
p = num;
}
int main() {
fn();
cout << p[0] << " " << p[0];
}
Run Code Online (Sandbox Code Playgroud) 在RAII中,资源在访问之前不会初始化.但是,许多访问方法被声明为常量.我需要调用mutable(非const)函数来初始化数据成员.
示例:从数据库加载
struct MyClass
{
int get_value(void) const;
private:
void load_from_database(void); // Loads the data member from database.
int m_value;
};
int
MyClass ::
get_value(void) const
{
static bool value_initialized(false);
if (!value_initialized)
{
// The compiler complains about this call because
// the method is non-const and called from a const
// method.
load_from_database();
}
return m_value;
}
Run Code Online (Sandbox Code Playgroud)
我的原始解决方案是将数据成员声明为mutable.我宁愿不这样做,因为它表明其他方法可以改变成员.
如何转换load_from_database()语句以摆脱编译器错误?
为某些数据分配内存有什么好处.相反,我们可以使用它们的数组.
喜欢
int *lis;
lis = (int*) malloc ( sizeof( int ) * n );
/* Initialize LIS values for all indexes */
for ( i = 0; i < n; i++ )
lis[i] = 1;
Run Code Online (Sandbox Code Playgroud)
我们可以使用普通的数组.
好吧,我不明白malloc是如何工作的,实际上是做什么的.所以解释它们对我来说会更有益.
假设我们sizeof(int) * n只n用上面的代码替换然后尝试存储整数值,我可能面临哪些问题?有没有办法直接从内存分配空间打印存储在变量中的值,例如这里是lis?
我问的是关于成员"mylist"的更好的做法是什么:
像这样声明mylist:
class MyClaz {
std::list<string> mylist;
...
}
Run Code Online (Sandbox Code Playgroud)
或者像这样声明:
class MyClaz {
std::list<string> *mylst;
MyClaz();
...
}
MyClaz::MyClaz() {
myList = new std::list<string>();
}
// plus destructor to delete myList
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,当创建MyClaz实例时,是否会自动分配mylist?当MyClaz被销毁时,它会被正确清理吗?
是否有理由使用第二种情况?这似乎更危险.
你会改变这段代码中的任何内容吗?
class LocalPort {
public:
LocalPort(int portNumber) {
innerPort = new ACMEPort(portNumber);
}
void Open() {
try {
innerPort->Open();
}
catch (DeviceResponseException& e) {
throw PortDeviceFailure(e);
}
catch (ATM1212UnlockedException& e) {
throw PortDeviceFailure(e);
}
catch (GMXError& e) {
throw PortDeviceFailure(e);
}
}
private:
ACMEPort* innerPort;
};
/////////
try {
LocalPort* port = new LocalPort(12);
port->Open();
}
catch (bad_alloc& e) {
ReportError(e);
logger.Log("Wyj?tek alokacji pami?ci", e);
delete port;
}
catch (PortDeviceFailure& e) {
ReportError(e);
logger.Log(e.getMessage(), e);
delete port;
}
Run Code Online (Sandbox Code Playgroud)
我上面 …
我今天遇到了一个关于局部变量的问题.我了解到......
int * somefunc()
{
int x = 5;
return &x;
}
int * y = somefunc();
//do something
Run Code Online (Sandbox Code Playgroud)
是坏的,不安全的等等.我想这个案子是一样的......
int * somefunc()
{
int * x = new int;
x = 5;
return x;
}
int * y = somefunc();
//do something
delete y;
Run Code Online (Sandbox Code Playgroud)
我一直认为这是最安全的印象,因为当它返回时x的地址保持在范围内.但是,我现在有了第二个想法,我认为这会导致内存泄漏和其他问题,就像第一个例子那样.有人可以帮我确认吗?