diff --git a/src/gui/painting/qdatabuffer_p.h b/src/gui/painting/qdatabuffer_p.h
index bc5f1ef..8f8544f 100644
--- a/src/gui/painting/qdatabuffer_p.h
+++ b/src/gui/painting/qdatabuffer_p.h
@@ -60,16 +60,20 @@ QT_BEGIN_NAMESPACE
 template <typename Type> class QDataBuffer
 {
 public:
-    QDataBuffer(int res = 64)
+    QDataBuffer(int res)
     {
         capacity = res;
-        buffer = (Type*) qMalloc(capacity * sizeof(Type));
+        if (res)
+            buffer = (Type*) qMalloc(capacity * sizeof(Type));
+        else
+            buffer = 0;
         siz = 0;
     }
 
     ~QDataBuffer()
     {
-        qFree(buffer);
+        if (buffer)
+            qFree(buffer);
     }
 
     inline void reset() { siz = 0; }
@@ -104,6 +108,8 @@ public:
 
     inline void reserve(int size) {
         if (size > capacity) {
+            if (capacity == 0)
+                capacity = 1;
             while (capacity < size)
                 capacity *= 2;
             buffer = (Type*) qRealloc(buffer, capacity * sizeof(Type));
@@ -112,7 +118,12 @@ public:
 
     inline void shrink(int size) {
         capacity = size;
-        buffer = (Type*) qRealloc(buffer, capacity * sizeof(Type));
+        if (size)
+            buffer = (Type*) qRealloc(buffer, capacity * sizeof(Type));
+        else {
+            qFree(buffer);
+            buffer = 0;
+        }
     }
 
     inline void swap(QDataBuffer<Type> &other) {
diff --git a/src/gui/painting/qoutlinemapper.cpp b/src/gui/painting/qoutlinemapper.cpp
index ad0c2eb..1b01960 100644
--- a/src/gui/painting/qoutlinemapper.cpp
+++ b/src/gui/painting/qoutlinemapper.cpp
@@ -154,7 +154,8 @@ QT_FT_Outline *QOutlineMapper::convertPath(const QVectorPath &path)
         // ### We can kill this copying and just use the buffer straight...
 
         m_elements.resize(count);
-        memcpy(m_elements.data(), path.points(), count* sizeof(QPointF));
+        if (count)
+            memcpy(m_elements.data(), path.points(), count* sizeof(QPointF));
 
         m_element_types.resize(0);
     }
diff --git a/src/gui/painting/qoutlinemapper_p.h b/src/gui/painting/qoutlinemapper_p.h
index d0ce1a9..39b7593 100644
--- a/src/gui/painting/qoutlinemapper_p.h
+++ b/src/gui/painting/qoutlinemapper_p.h
@@ -87,8 +87,15 @@ const int QT_RASTER_COORD_LIMIT = 32767;
 class QOutlineMapper
 {
 public:
-    QOutlineMapper()
-        : m_round_coords(false)
+    QOutlineMapper() :
+        m_element_types(0),
+        m_elements(0),
+        m_elements_dev(0),
+        m_points(0),
+        m_tags(0),
+        m_contours(0),
+        m_polygon_dev(0),
+        m_round_coords(false)
     {
     }
 
diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp
index 9148ac2..2b9fee4 100644
--- a/src/gui/painting/qpaintengine_raster.cpp
+++ b/src/gui/painting/qpaintengine_raster.cpp
@@ -336,7 +336,7 @@ void QRasterPaintEngine::init()
     d->hdc = 0;
 #endif
 
-    d->rasterPoolSize = 8192;
+    d->rasterPoolSize = 128;
     d->rasterPoolBase =
 #if defined(Q_WS_WIN64)
         // We make use of setjmp and longjmp in qgrayraster.c which requires
diff --git a/src/gui/painting/qpaintengine_raster_p.h b/src/gui/painting/qpaintengine_raster_p.h
index 55eb82e..f59cf54 100644
--- a/src/gui/painting/qpaintengine_raster_p.h
+++ b/src/gui/painting/qpaintengine_raster_p.h
@@ -300,6 +300,10 @@ QRasterPaintEnginePrivate : public QPaintEngineExPrivate
 {
     Q_DECLARE_PUBLIC(QRasterPaintEngine)
 public:
+    QRasterPaintEnginePrivate() : QPaintEngineExPrivate(),
+        cachedLines(0)
+    {
+    }
 
     void rasterizeLine_dashed(QLineF line, qreal width,
                               int *dashIndex, qreal *dashOffset, bool *inDash);
diff --git a/src/gui/painting/qpaintengineex.cpp b/src/gui/painting/qpaintengineex.cpp
index a78cafb..fda937e 100644
--- a/src/gui/painting/qpaintengineex.cpp
+++ b/src/gui/painting/qpaintengineex.cpp
@@ -149,6 +149,7 @@ QDebug Q_GUI_EXPORT &operator<<(QDebug &s, const QVectorPath &path)
 
 
 struct StrokeHandler {
+    StrokeHandler(int reserve) : pts(reserve), types(reserve) {}
     QDataBuffer<qreal> pts;
     QDataBuffer<QPainterPath::ElementType> types;
 };
@@ -394,7 +395,7 @@ void QPaintEngineEx::stroke(const QVectorPath &path, const QPen &pen)
         return;
 
     if (!d->strokeHandler) {
-        d->strokeHandler = new StrokeHandler;
+        d->strokeHandler = new StrokeHandler(path.elementCount()+4);
         d->stroker.setMoveToHook(qpaintengineex_moveTo);
         d->stroker.setLineToHook(qpaintengineex_lineTo);
         d->stroker.setCubicToHook(qpaintengineex_cubicTo);
diff --git a/src/gui/painting/qpathclipper.cpp b/src/gui/painting/qpathclipper.cpp
index c910024..78553c9 100644
--- a/src/gui/painting/qpathclipper.cpp
+++ b/src/gui/painting/qpathclipper.cpp
@@ -278,7 +278,8 @@ private:
 };
 
 SegmentTree::SegmentTree(QPathSegments &segments)
-    : m_segments(segments)
+    : m_segments(segments),
+      m_intersections(0)
 {
     m_bounds.x1 = qt_inf();
     m_bounds.y1 = qt_inf();
@@ -806,7 +807,7 @@ void QWingedEdge::intersectAndAdd()
     for (int i = 0; i < m_segments.points(); ++i)
         addVertex(m_segments.pointAt(i));
 
-    QDataBuffer<QPathSegments::Intersection> intersections;
+    QDataBuffer<QPathSegments::Intersection> intersections(m_segments.segments());
     for (int i = 0; i < m_segments.segments(); ++i) {
         intersections.reset();
 
@@ -857,11 +858,17 @@ void QWingedEdge::intersectAndAdd()
     }
 }
 
-QWingedEdge::QWingedEdge()
+QWingedEdge::QWingedEdge() :
+    m_edges(0),
+    m_vertices(0),
+    m_segments(0)
 {
 }
 
-QWingedEdge::QWingedEdge(const QPainterPath &subject, const QPainterPath &clip)
+QWingedEdge::QWingedEdge(const QPainterPath &subject, const QPainterPath &clip) :
+    m_edges(subject.length()),
+    m_vertices(subject.length()),
+    m_segments(subject.length())
 {
     m_segments.setPath(subject);
     m_segments.addPath(clip);
@@ -1414,9 +1421,9 @@ bool QPathClipper::intersect()
     else if (clipIsRect)
         return subjectPath.intersects(r2);
 
-    QPathSegments a;
+    QPathSegments a(subjectPath.length());
     a.setPath(subjectPath);
-    QPathSegments b;
+    QPathSegments b(clipPath.length());
     b.setPath(clipPath);
 
     QIntersectionFinder finder;
@@ -1459,9 +1466,9 @@ bool QPathClipper::contains()
     if (clipIsRect)
         return subjectPath.contains(r2);
 
-    QPathSegments a;
+    QPathSegments a(subjectPath.length());
     a.setPath(subjectPath);
-    QPathSegments b;
+    QPathSegments b(clipPath.length());
     b.setPath(clipPath);
 
     QIntersectionFinder finder;
diff --git a/src/gui/painting/qpathclipper_p.h b/src/gui/painting/qpathclipper_p.h
index 7962400..fab618d 100644
--- a/src/gui/painting/qpathclipper_p.h
+++ b/src/gui/painting/qpathclipper_p.h
@@ -199,7 +199,7 @@ public:
     };
 
 
-    QPathSegments();
+    QPathSegments(int reserve);
 
     void setPath(const QPainterPath &path);
     void addPath(const QPainterPath &path);
@@ -345,7 +345,10 @@ inline QPathVertex::operator QPointF() const
     return QPointF(x, y);
 }
 
-inline QPathSegments::QPathSegments()
+inline QPathSegments::QPathSegments(int reserve) :
+    m_points(reserve),
+    m_segments(reserve),
+    m_intersections(reserve)
 {
 }
 
diff --git a/src/gui/painting/qpolygonclipper_p.h b/src/gui/painting/qpolygonclipper_p.h
index 1b4cbb3..cdaac1c 100644
--- a/src/gui/painting/qpolygonclipper_p.h
+++ b/src/gui/painting/qpolygonclipper_p.h
@@ -62,7 +62,8 @@ QT_BEGIN_NAMESPACE
 template <typename InType, typename OutType, typename CastType> class QPolygonClipper
 {
 public:
-    QPolygonClipper()
+    QPolygonClipper() :
+        buffer1(0), buffer2(0)
     {
         x1 = y1 = x2 = y2 = 0;
     }
diff --git a/src/gui/painting/qrasterizer.cpp b/src/gui/painting/qrasterizer.cpp
index 51d01c9..f8f8afb 100644
--- a/src/gui/painting/qrasterizer.cpp
+++ b/src/gui/painting/qrasterizer.cpp
@@ -198,9 +198,11 @@ public:
 };
 
 QScanConverter::QScanConverter()
-   : m_alloc(0)
+   : m_lines(0)
+   , m_alloc(0)
    , m_size(0)
    , m_intersections(0)
+   , m_active(0)
 {
 }
 
@@ -310,6 +312,10 @@ struct QBoolToType
 template <typename T>
 void qScanConvert(QScanConverter &d, T allVertical)
 {
+    if (!d.m_lines.size()) {
+        d.m_active.reset();
+        return;
+    }
     qSort(d.m_lines.data(), d.m_lines.data() + d.m_lines.size(), QT_PREPEND_NAMESPACE(topOrder));
     int line = 0;
     for (int y = d.m_lines.first().top; y <= d.m_bottom; ++y) {
diff --git a/src/gui/painting/qstroker.cpp b/src/gui/painting/qstroker.cpp
index e43544c..9b8e099 100644
--- a/src/gui/painting/qstroker.cpp
+++ b/src/gui/painting/qstroker.cpp
@@ -187,7 +187,7 @@ static inline qreal adapted_angle_on_x(const QLineF &line)
 }
 
 QStrokerOps::QStrokerOps()
-    : m_customData(0), m_moveTo(0), m_lineTo(0), m_cubicTo(0)
+    : m_elements(0), m_customData(0), m_moveTo(0), m_lineTo(0), m_cubicTo(0)
 {
 }
 
diff --git a/src/opengl/gl2paintengineex/qgl2pexvertexarray_p.h b/src/opengl/gl2paintengineex/qgl2pexvertexarray_p.h
index adc69ee..46029b9 100644
--- a/src/opengl/gl2paintengineex/qgl2pexvertexarray_p.h
+++ b/src/opengl/gl2paintengineex/qgl2pexvertexarray_p.h
@@ -100,8 +100,10 @@ class QGL2PEXVertexArray
 {
 public:
     QGL2PEXVertexArray() :
+        vertexArray(0), vertexArrayStops(0),
         maxX(-2e10), maxY(-2e10), minX(2e10), minY(2e10),
-        boundingRectDirty(true) {}
+        boundingRectDirty(true)
+    { }
     
     inline void addRect(const QRectF &rect)
     {
diff --git a/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h b/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h
index 6ba0c42..0a046dc 100644
--- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h
+++ b/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h
@@ -177,6 +177,7 @@ public:
             ctx(0),
             useSystemClip(true),
             elementIndicesVBOId(0),
+            opacityArray(0),
             snapToPixelGrid(false),
             addOffset(false),
             nativePaintingActive(false),
diff --git a/src/opengl/gl2paintengineex/qtriangulatingstroker.cpp b/src/opengl/gl2paintengineex/qtriangulatingstroker.cpp
index f677ce1..9bc099d 100644
--- a/src/opengl/gl2paintengineex/qtriangulatingstroker.cpp
+++ b/src/opengl/gl2paintengineex/qtriangulatingstroker.cpp
@@ -481,7 +481,8 @@ static void qdashprocessor_cubicTo(qreal, qreal, qreal, qreal, qreal, qreal, voi
 }
 
 QDashedStrokeProcessor::QDashedStrokeProcessor()
-    : m_dash_stroker(0), m_inv_scale(1)
+    : m_points(0), m_types(0),
+      m_dash_stroker(0), m_inv_scale(1)
 {
     m_dash_stroker.setMoveToHook(qdashprocessor_moveTo);
     m_dash_stroker.setLineToHook(qdashprocessor_lineTo);
@@ -499,6 +500,8 @@ void QDashedStrokeProcessor::process(const QVectorPath &path, const QPen &pen, c
 
     m_points.reset();
     m_types.reset();
+    m_points.reserve(path.elementCount());
+    m_types.reserve(path.elementCount());
 
     qreal width = qpen_widthf(pen);
     if (width == 0)
diff --git a/src/opengl/gl2paintengineex/qtriangulatingstroker_p.h b/src/opengl/gl2paintengineex/qtriangulatingstroker_p.h
index 956d7cc..ab27ed6 100644
--- a/src/opengl/gl2paintengineex/qtriangulatingstroker_p.h
+++ b/src/opengl/gl2paintengineex/qtriangulatingstroker_p.h
@@ -54,6 +54,7 @@ QT_BEGIN_NAMESPACE
 class QTriangulatingStroker
 {
 public:
+    QTriangulatingStroker() : m_vertices(0) {}
     void process(const QVectorPath &path, const QPen &pen, const QRectF &clip);
 
     inline int vertexCount() const { return m_vertices.size(); }
diff --git a/src/opengl/gl2paintengineex/qtriangulator.cpp b/src/opengl/gl2paintengineex/qtriangulator.cpp
index ce917ff..df7cbc2 100644
--- a/src/opengl/gl2paintengineex/qtriangulator.cpp
+++ b/src/opengl/gl2paintengineex/qtriangulator.cpp
@@ -510,6 +510,7 @@ template <class T>
 class QMaxHeap
 {
 public:
+    QMaxHeap() : m_data(0) {}
     inline int size() const {return m_data.size();}
     inline bool empty() const {return m_data.isEmpty();}
     inline bool isEmpty() const {return m_data.isEmpty();}
@@ -1299,7 +1300,8 @@ public:
     class ComplexToSimple
     {
     public:
-        inline ComplexToSimple(QTriangulator *parent) : m_parent(parent) { }
+        inline ComplexToSimple(QTriangulator *parent) : m_parent(parent),
+            m_edges(0), m_events(0), m_splits(0) { }
         void decompose();
     private:
         struct Edge
@@ -1412,7 +1414,7 @@ public:
     class SimpleToMonotone
     {
     public:
-        inline SimpleToMonotone(QTriangulator *parent) : m_parent(parent) { }
+        inline SimpleToMonotone(QTriangulator *parent) : m_parent(parent), m_edges(0), m_upperVertex(0) { }
         void decompose();
     private:
         enum VertexType {MergeVertex, EndVertex, RegularVertex, StartVertex, SplitVertex};
@@ -1486,7 +1488,7 @@ public:
         int m_length;
     };
 
-    inline QTriangulator() { }
+    inline QTriangulator() : m_vertices(0) { }
 
     // Call this only once.
     void initialize(const qreal *polygon, int count, uint hint, const QTransform &matrix);
@@ -2709,7 +2711,7 @@ void QTriangulator::SimpleToMonotone::monotoneDecomposition()
         return;
 
     Q_ASSERT(!m_edgeList.root);
-    QDataBuffer<QPair<int, int> > diagonals;
+    QDataBuffer<QPair<int, int> > diagonals(m_upperVertex.size());
 
     int i = 0;
     for (int index = 1; index < m_edges.size(); ++index) {
@@ -2853,7 +2855,7 @@ bool QTriangulator::SimpleToMonotone::CompareVertices::operator () (int i, int j
 void QTriangulator::MonotoneToTriangles::decompose()
 {
     QVector<quint32> result;
-    QDataBuffer<int> stack;
+    QDataBuffer<int> stack(m_parent->m_indices.size());
     m_first = 0;
     // Require at least three more indices.
     while (m_first + 3 <= m_parent->m_indices.size()) {
diff --git a/src/opengl/qpaintengine_opengl.cpp b/src/opengl/qpaintengine_opengl.cpp
index 306fd8b..d2b0d4f 100644
--- a/src/opengl/qpaintengine_opengl.cpp
+++ b/src/opengl/qpaintengine_opengl.cpp
@@ -668,6 +668,7 @@ public:
         , last_created_state(0)
         , shader_ctx(0)
         , grad_palette(0)
+        , tess_points(0)
         , drawable_texture(0)
         , ref_cleaner(this)
         {}
@@ -1950,6 +1951,8 @@ void QOpenGLPaintEnginePrivate::pathToVertexArrays(const QPainterPath &path)
 
 void QOpenGLPaintEnginePrivate::drawVertexArrays()
 {
+    if (tess_points_stops.count() == 0)
+        return;
     glEnableClientState(GL_VERTEX_ARRAY);
     glVertexPointer(2, GL_DOUBLE, 0, tess_points.data());
     int previous_stop = 0;
