如何为类类型重载new运算符,以便它在堆栈而不是堆上分配内存(基本上这样用户之后就不必调用delete).
这样的事情怎么样:
class A{
private:
A(int i):
this->i(i);
{}
A a;
int i;
public:
void* operator new(size_t sz){
a(12);
}
};
Run Code Online (Sandbox Code Playgroud)
以上解决方案是否有效?
在Qt中,我理解如果您创建一个继承自QObject的对象并将其设置为父对象,则父对象负责删除子对象.我也明白,如果你在堆栈上创建对象,当它们超出范围时会被删除.
我并没有围绕我想要显式删除QStringList(或任何QList)中的项目然后是列表本身的情况.
考虑我是否创建了一个QStringList并填充如下:
QStringList multiPartPortionList;
multiPartPortionList = multiPartPortion.split(QRegExp("[\r\n]"),QString::SkipEmptyParts);
Run Code Online (Sandbox Code Playgroud)
然后我用它做一些事情并调用此方法以尝试显式删除列表中包含的项目,然后是列表本身:
void MyClass::deleteList(QStringList list) {
// Now cleanup
QStringList *delList = new QStringList(list);
int numObjects = delList->count();
for (int i=0; i < numObjects; i++)
delete (new QString(list.takeAt(0)));
delList->clear();
delete delList;
delList = 0;
}
Run Code Online (Sandbox Code Playgroud)
我不能调用qDeleteall(list)因为它需要一个指针,而我也做不到:
delete list;
Run Code Online (Sandbox Code Playgroud)
因为它'给'删除',预期指针'的参数错误,期望一个指针.
我得到了分段错误:
void MyClass::deleteList(QStringList list) {
// Now cleanup
QStringList *delList = &list; // <--- Seg fault with this
int numObjects = delList->count();
for (int i=0; i < numObjects; i++)
delete (new QString(list.takeAt(0))); …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
result = binding.downloadData(sourceURLString.replace("{CAT_ID}", catId), Data.class);
ArrayList<Data> mAllProducts = result.getProducts();
cloneList(mAllProducts);
System.gc();
Run Code Online (Sandbox Code Playgroud)
这是mAllProducts ArrayList的深层副本
static List<Data> clone;
public static void cloneList(ArrayList<Data> list) {
clone = new ArrayList<Data>();
for(Data item: list){
clone.add(new Data(item));
}
}
Run Code Online (Sandbox Code Playgroud)
数据构造函数:
public Data(Data item2) {
this.imageUrl = item2.imageUrl;
*
*
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
我有以下程序:
#include<iostream>
#include<map>
using namespace std;
int *ar;
int main(int argc, const char *argv[])
{
int N,i;
map <int , int> W;
ar = new int[N+1];
cin >> N;
for (i = 1; i <= N; i++) {
cin >> ar[i];
}
W[ar[N]]= -1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我给以下输入程序:
6
1 1 2 2 3 4
Run Code Online (Sandbox Code Playgroud)
如果我使用g ++ -O选项编译上面的代码(没有优化),我会在行中获得segabrt
W[ar[N]]= -1;
Run Code Online (Sandbox Code Playgroud)
两个问题:
是不是ar []没有被新分配的内存?如果我用一些常数值替换该行,我会得到相同的错误.
W[4] = -1;
Run Code Online (Sandbox Code Playgroud)地图需要某种初始化吗?它通常无需初始化即可工作.
我有以下代码(它获取所有进程然后在其中搜索正则表达式模式,代码用于恶意软件检测的更大的个人项目),代码执行我想要的但唯一的问题是它使用100%的CPU,做什么我做错了?内存分配不好?我用MS Visual Studio 2010编译它(cl.exe/EHsc mycode.cpp)
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include <tlhelp32.h>
#include <psapi.h>
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <iterator>
#include <regex>
using namespace std;
#pragma comment(lib, "psapi.lib")
void PrintProcessNameAndID(DWORD);
void find_locs(HANDLE process);
void ListProcesses();
int main(int argc, char **argv) {
ListProcesses();
}
void find_locs(HANDLE process) {
unsigned char *p = NULL;
MEMORY_BASIC_INFORMATION info;
for ( p = NULL;
VirtualQueryEx(process, p, &info, sizeof(info)) == sizeof(info);
p += info.RegionSize )
{
std::string buffer;
if …Run Code Online (Sandbox Code Playgroud) 假设我有一个1 GB的文本文件,我想阅读它.如果我尝试打开此文件,我会收到"内存溢出"错误.我知道,通常的答案是"使用StreamReader.ReadLine()方法".但我想知道这是如何工作的.如果使用ReadLine方法的程序想要获取一行,则必须迟早打开整个文本文件.据我所知,文件存储在磁盘上,它们可以在"全有或全无"的原则下在内存中打开.如果我的1 GB文本文件中只有一行通过使用ReadLine()方法一次存储在内存中,这意味着我们必须在读取1 GB文本文件的每一行时使用磁盘IO.这对于表演来说这不是一件可怕的事情吗?
我很困惑,我想要一些有关这方面的细节.
我得到了以下代码:
T *p = new T[10];
delete p;
Run Code Online (Sandbox Code Playgroud)
它应该是删除[] p,我想.我在T = int类型上尝试过它,没有错误.然后我创建了一个简单的类,异常.任何明确的解释?
T *p = 0;
delete p;
Run Code Online (Sandbox Code Playgroud)
他们怎么了?[我查了一下,似乎虽然删除p会导致错误,但程序恢复因为编译器首先认为p == 0,所以这个错误并不重要.]
好吧,我想这个问题可能听起来太傻了,但内存管理(特别是在C/C++中)从来都不是我的强项,因为它通常不是一个值得注意的事情,我倾向于忽视它.所以,请原谅我,如果这一切听起来都很愚蠢.然而,由于我目前的项目涉及大量数据和处理,内存消耗在几秒钟内很容易超过2GB,这肯定会减慢整个事情的速度,所以...是时候我开始考虑如何修复它了.
所以,这是我的情况......
我的主要类(我正在创建数百万个实例(希望它们被自动删除,因为它们不再被使用),所以据说这是罪魁祸首)是(大致)这个:
class MyClass
{
public:
// My Constructors
MyClass ();
MyClass (std::string param);
// My Destructor (still empty)
virtual ~MyClass ();
// Some methods
void methodA(std::string moves);
void methodB();
//----------------------
// My Variables
//----------------------
boost::array<int,64> arrA;
boost::array<unsigned int,13> arrB;
unsigned int key;
boost::array<int,3> arrC;
int argA;
int argB;
};
Run Code Online (Sandbox Code Playgroud)
这是(粗略地 - 实际代码已被更改)如何创建上述类的实例:
vector<MyClass*> SomeOtherClass::getListOfObjects()
{
vector<MyClass*> objects;
for (int i=0; i<MAX_OBJS; i++)
{
// Do some preparatory work
objects += new MyClass();
} …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法在运行时为现有结构(已经最初分配了内存)分配额外的内存(在C中).我有一种感觉,我可以使用memmove或类似的东西,但这仍然只是一个复制操作,并没有增加运行时结构可用的内存量.此外,我不想每次需要时都复制整个结构,这在程序期间会有数百次(结构已经很大).有人可以帮忙吗?
更新:感谢大家的回复.为了提供更多细节,我想要做的是运行一个MPI并行化的代码,该代码最初创建了许多结构实例(称之为'S').结构的每个实例都包含一个数组'T',它记录了代码运行时发生的特定事件的时间.这些事件在运行时发生,并且每个S实例的事件数量不同.例如,S [0]可能会看到100个事件(因此需要一个长度为100个元素的数组),但S [1]可能只看到1个事件(以及S [2] 30事件等)因此,为S的每个实例(有数百万个)在开始时分配大量内存将是非常浪费的,因为有些可能会填充数组但其他人不会甚至接近.事实上,我已经尝试过这个,对于我运行它的机器来说太过分了.
我会在这里尝试一些想法并发布我的进展.非常感谢!
我想创建很多相同类型的对象,我希望它们在内存中相对接近以避免页面未命中.
有没有办法告诉操作系统(Windows平台)尽可能接近给定地址分配内存?(地址提示)
某些功能隐藏在MSDN中?
我知道有新的操作员位置,但我想知道是否还有其他技巧.
是的,我知道如何创建自定义内存管理与新的....
伪代码(如果存在):
Myclass *a = new Myclass();
Myclass *b = AloocateNear(a,sizeof(Myclass));
Run Code Online (Sandbox Code Playgroud) c++ ×7
memory ×3
memory-leaks ×2
new-operator ×2
arrays ×1
boost ×1
c ×1
c# ×1
destructor ×1
java ×1
map ×1
pointers ×1
qt ×1
templates ×1